您的位置:首页 > 其它

sed命令学习

2015-12-26 16:14 176 查看
绪:下文仅是本人学习sed时候的一些记录,欢迎拍砖指正

sed基本编辑命令:
# 建立批注(\为换行符)
{ } 集合有相同位址参数的指令。
! 不执行函数参数(若匹配则不执行)
注@:$!N #不是最后一行,执行N命令
sed '/---/!s/--/replace/g' #注意使用技巧
= 打印匹配行的行号( line number ) --最多一个地址参数(行数在数据前一行输出)
a\ 添加使用者输入的数据 --最多一个地址参数(\表示换行,不可缺少)
i\ 插入添加使用者输入的数据行 --最多一个地址参数(\表示换行,不可缺少)
注@:插入与追加命令不影响模式空间的内容,同时增加的内容对后续命令是透明的
当命令执行完时,增加的内容将被打印
注@:若增加的内容多于一行,必须用\ 屏蔽换行符,否则将会被第一个换行符终止增加
插入命令可以用来在当前行之前加放置一个空行
追加与更改命令可以用来在当前行之后放置一个空行
在匹配到的每个行后面插入或者追加
c\ 以使用者输入的数据替代匹配到的内容 --最多两个地址参数(\表示换行,不可缺少)
注@:有两个地址参数的时候,用目标字符串取代所有被寻址匹配的行(目标字符串只输出一次)
当更改命令作为一组命令之一被封闭在大括号中并作用于一个范围内的行时,目标字符串将输出多次
该命令会清楚模式空间(与删除命令有同样的效果)
d 删除数据 --最多两个地址参数
注@:删除模式空间中的当前行,并读取下一行到模式空间
即使模式空间有多行,也会全部清空
改变了控制流的命令
l 打印输出(与p及像),其中nonprinting character(非打印字符)用ASCII 码表示
注@:较长的行被折行
n 输出当前行并读取下一个输入行到模式空间(覆盖了原来pattern space中的数据) --最多两个地址参数
注@:将控制转移到n后面的命令,而不是恢复到脚本的顶部
输入的下一行取代模式空间的当前行
p 打印匹配行 --最多两个地址参数
注@:可能导致输出的重复,除非使用 -n / #n 命令行选项限制
常用于改变流控制(d、n、b)的命令之前并可能阻止当前行被输出
q 遇到匹配行时退出,并打印匹配行(除非限制了默认输出) --最多一个地址参数
注@:包括 a/r 命令追加的内容
有类似head读取多少行的功能
r 读取另一个文件中的内容并追加到模式空间内容的后面 --最多一个地址参数(r与文件之间必须有一个空格)
注@:将文件确定的行之后的内容读入到模式空间
文件不存在,不会报错
读命令的结果输出无法被抑制
w 将模式空间的内容追加到文件 --最多两个地址参数(w与文件之间必须有一个空格)
注@:这个动作是在遇到命令时发生,而不是在输出模式空间内容时发生
每个脚本最多只能打开10个文件
若文件存在,则每次执行脚本时将改变其内容(待确认是覆盖还是追加)
追加写入
s 替换字符串 --最多两个地址参数
注@:sed '[ address [,address]] s/ pattern-to-find /replacement-pattern/[g p w n]'
g 缺省情况下只替换第一次出现模式,使用g选项替换全局所有出现模式。
p 如果替换成功则打印该行,加p选项将使 -n 选项无效
注@:若成功进行了多个替换,将打印这个行的多个副本
n 1--512之间的一个数字,对第几次出现的模式进行替换(默认值为1)
w file 如果发生一次替换则将该行写入到file文件
注@:最多可以打开10个不同的file
附@:sed ':a ; N ; $!ba ;s/root/feyiz/4' #替换第4次出现的指定字符
sed '/a/{x;s/^/./;/^.\{4\}$/{x;s/root/feyiz/;b};x}' urfile #高效
sed '/foo/ s/foo/bar/g' filename #高效替换
sed '/foo/ s//bar/g' filename
y 转换(transform)字符 --最多两个地址参数
注@:按对应位置一一转换字符
改变流程顺序的高级命令
N 添加下一笔资料到pattern space --最多两个地址参数
注@:在多行模式空间中,^ 只匹配空间中的第一个字符,不匹配换行符后面的字符;$ 类似
可用于实现多行模式匹配
P 打印由 N 命令创建的多行pattern space 内的第一行数据 --最多两个地址参数
注@:在执行完脚本中的最后一个命令之后,模式空间的内容默认自动输出
常用于N 命令之后、D命令之前,这三个命令可以建立一个输入/输出循环,用来维护一个两行的模式空间,但是每次只输出一行
若没有将 N 用于于某一行则和 p 相同
D 删除由N创建的多行pattern space 内的第一行数据,并且用脚本的第一行命令重新编辑 --最多两个地址参数
注@:D删除后 , pattern space 内不添加下一笔数据 , 而将剩下的数据重新执行
注@:若该命令使模式空间为空,则读取下一个输入行(与d命令一样)
d 则读入下一行后执行
d命令可以改变脚本中控制流的命令(删除命令会导致读取新的输入行,而编辑脚本则从头开始新的一轮)
g 拷贝数据从hold space至pattern space --最多两个地址参数(覆盖原数据)
注@:若保持空间为空,则将换行符添加到模式空间
G 添加资料从hold space 至pattern space --最多两个地址参数(追加)
注@:若保持空间为空,则将换行符添加到模式空间
当保持空间有多行时,同时把多行数据拷贝到模式空间
h 拷贝数据从pattern space 至hold space --最多两个地址参数(覆盖原数据)
注@:当模式空间有多行数据时,同时把模式空间的多行拷贝到保持空间
H 添加资料从pattern space 至hold space --最多两个地址参数(追加)
注@:将换行符和模式空间的内容追加到保持空间
即使保持空间为空,也追加换行符
x 交换hold space 与pattern space 的内容
: label 定义标签
注@:标签的长度不超过7个字符
冒号与标签之间不允许有空格,行尾的空格将被看做标签的一部分
分支或者测试命令与标签之间允许有空格,但标签后面不能存在空格
b label 无条件跳转到标签label,如果label没有指定,跳转到命令的结尾(Loop、case、while)
注@:分支命令,用于无条件转移
可以简单的理解为continue
t label 测试在寻址的行范围内是否成功进行了替换,如果是,则跳转到标签label;若没有指定label,跳转到命令的结尾(until)
注@:测试命令,用于有条件转移
sed '/^AA/s/$/ YES/;t;s/$/ NO/' urfile #是AA就加YES,否则就加NO
sed '/^AA/ba;s/$/ NO/;b;:a;s/$/ YES/' urfile
date +%m | sed 's/$/b12a01a02a03a04a05a06a07a08a09a10a11a12/;s/^\(..\)b.*\(..\)a\1.*/\2/' #利用lookup table取上个月的月份
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: