sed命令是linux或者shell编程中常用的筛选、替换命令,如果能熟练使用sed则对经常使用的人来说在工作上是非常有帮助的
下面把sed主要的用法列出来(有错误的地方大家可以指正):
p命令
只打印第三行,没有-n会在第三行后多打印第三行:sed -n '3p' filename 只打印最后一行:sed -n '$p' filename 只打印10到20行(包括10和20行,若后面数字小于前面数字,则只打印前面数字的行):sed -n '10,20p' filename 打印包含My在行尾的行到包含You的行:sed -n '/My$/,/You/p' filename 打印匹配行和接着的5行:sed -n '/My/,+5p' datafile 打印匹配行和下面行号为5的行,直到结尾:sed -n '/My/,~5p' datafile 打印5倍数的行:sed -n '0~5p' filesed '0~5!d' file----------------------------------------------------------
P命令
打印模式空间中第一个换行符前的内容其实就是打印单数行
---------------------------------------------------------
d命令
删除第五行并打印其他行:sed '5d' filename删除包含My的行到包含You的行,不打印:sed -n '/My/,/You/d' filename删除包含My的行到第八行,不打印其他行:sed -n '/My/,8d' filename---------------------------------------------------------
D命令删除模式空间中第一个换行符前的内容其实就是打印双数行
---------------------------------------------------------
s命令
一个字符串替换另一个sed 's/^My/You/g' datafileg表示行内全局替换,也可用数值代替3g表示从第三个匹配到的开始全局替换 sed -n '1,20s#My$#You#gp' datafile打印1到20行内以My结尾的替换为You的行注:紧跟s的符号为分隔符,除了换行符反斜杠 sed 's/^My/You/g;s/are/Are/g' datafile同时替换多个 sed '/ABC/!s/^My/You/g;s/are/Are/g' datafile替换不包含ABC的行---------------------------------------------------------
r命令
sed '/^My/r datafile1' datafile2把datafile1中的所有内容插入到在datafile2中以My开头的行之后---------------------------------------------------------
w命令
sed '/^My/w datafile1' datafile2把在datafile2中以My开头的行写入到datafile1中---------------------------------------------------------
a命令
在查找到的行后追加,有\,则直接跟文本sed '/My/a\hi,world\nhow are you' datafile同r命令,只不过是写入一段文字---------------------------------------------------------
i命令
当前行的前面插入新的文本sed '/My/i\hi,world\nhow are you' datafile用法同a\,只是文本插入到前面---------------------------------------------------------
c命令
将查到的文本修改成新文本sed '/My/c\hi,world\nhow are you' datafile用法同a\和i\---------------------------------------------------------
N命令
将下一行输入追加到模式空间以\n分隔sed '/My/{N;s/My/Your/;}' datafile若最后一行为奇数行,则N后面命令也不执行---------------------------------------------------------
n命令将下一行输入读入到模式空间---------------------------------------------------------
y命令
sed '1,5y/abcd/ABCD/' datafile把abcd都换成大写,和s命令一样/可以换用法同tr命令---------------------------------------------------------
q命令
退出命令sed '/My/{q;s/My/Your/;}' datafile不会执行s/My/Your/---------------------------------------------------------
h/H命令和g/G命令
h清除缓冲区内容,保存最近执行h模式内容H把匹配到内容追加保存在缓冲区g把缓冲区内容替换掉模式内容G把缓冲区内容追加到模式空间行后sed -e '/My/h' -e '$g' datafilesed -e '/My/H' -e '$G' datafileg: 将hold space中的内容拷贝到pattern space中,原来pattern space里的内容清除
G: 将hold space中的内容append到pattern space\n后h: 将pattern space中的内容拷贝到hold space中,原来的hold space里的内容被清除H: 将pattern space中的内容append到hold space\n后x: 交换pattern space和hold space的内容---------------------------------------------------------
x命令
交换保持空间和模式空间的内容---------------------------------------------------------
l命令
显示特殊字符,不显示乱码sed -n '1,$l' f1---------------------------------------------------------
-f参数
sed -n -f script datafile---------------------------------------------------------
-i参数
直接修改文件,不会打印,如:sed -i G datafile把datafile中每行后面加个空行(G) sed -i 's/^My/You/g' datafile在文本中直接替换 sed -i '/My/{x;p;x}' datafile在有My行前面加一空白行 sed -i '$!N;/^\(.*\)\n\1$/!P;D' datafile删除相邻的重复行,只保留第一行---------------------------------------------------------
-i.bak修改原始文件并创建原始文件副本sed -i.bak 's/^My/You/g' datafile修改datafile并创建一个datafile.bak的备份---------------------------------------------------------
-e参数
sed命令中进行多重编辑sed -n -e '/My$/' -e 's/My/You/gp' datafile先打印以My结尾的行,再执行替换语句---------------------------------------------------------
=命令
打印行号:sed -n '=' f1$= 计算文本行数
sed -n '$=' datafile1 datafile2...---------------------------------------------------------
$!除了最后一行
4!除了第四行sed '4! s/My/Your/g' datafile除了第四行都执行替换---------------------------------------------------------
b命令
标签,可以跳转到标签执行,如sed '/^My/byyc;s/^/#/;b;:yyc;s/^My/Your/ datafile如果是My开头则换成Your,否则行前加#---------------------------------------------------------
sed正则表达式
\ 不转义,即元字符照常打印^ 以字符串开头,如/^My/以My开头的行$ 以字符串结尾,如/My$/以My结尾的行. 匹配一字符,如/M..y/M和y间有俩字符* 匹配0个或多个前面的字符[] 匹配里面的单字符,如/[Mh]y/匹配My和hy[^] 匹配不在里面的字符 如/[^Mh]y/匹配不是My和hy\(..\) 保存已经匹配的字符,用\n来呼出 如1,20s/\(you\)self/\1r/用\1呼出you, 最多保存9个,从左边开始标记& 保存查找串,如s/My/you&you/,&表示My\< 词首定位符,和^类似,如/\<My/\> 词尾定位符,和$类似,如/My\>/x\{m\} 连续m个x,如/a\{5\}/查找连续5个ax\{m,\} 至少m个x,如/a\{5,\}/至少5个ax\{m,n\} 至少m个x,最多n个x\w 匹配每个字母和数字\w\+ 匹配每一个单词\s 匹配每个空格\x\+ x表示一个字符or一个单词,当匹配到一个或者多个时操作