sed [options] 'command' file(s)sed [options] scriptfile file(s)#举例如下:sed -e '格式' 文件1 文件2 ...sed -n -e ‘操作’ 文件1 文件2 ...sed -f 脚本文件 文件1 文件2 ...sed -i -e '操作' 文件1 文件2 ...sed -e 'n {操作1 操作2...}' 文件1 文件2 ...
options:可以是 -e(表达式),-f(脚本文件)等。
command/scriptfile:包含一个或多个 sed 命令,也可以是脚本文件。
file(s):要处理的文本文件。
-e或--expression=: 表示用指定命令来处理输入的文本文件,只有一个操作命令时可省略,一般在执行多个操作命令使用;-f或--file=: 表示用指定的脚本文件来处理输入的文本文件;-i[SUFFIX]: 直接修改目标文本文件,如果设置了SUFFIX后缀名,sed会将数据备份;-n、--quiet或silent: 禁止自动打印模式空间内容,仅显示script处理后的结果;-r:启用扩展的正则表达式语法(在某些版本中使用-E选项);
s:替换模式匹配的文本;i\文本:在匹配的数据行前插入文本;a\文本:在匹配的数据行后追加文本;c\文本:用新文本替换匹配数据行的整行内容;r 文件:将文件的内容插入到当前行之后;w 文件:将当前匹配到的数据写入指定的文件中;l:小写L,打印当前匹配的数据行(显示控制字符,如回车符等);=:打印当前读取的数据所在的行数;q:[exit code] 立刻退出sed脚本;d:删除当前模式空间内容,并读取新内容;D:删除当前模式空间开头至\n的内容;h:将当前模式空间中内容覆盖至保持空间;H:将当前模式空间中内容追加至保持空间;g:将当前保持空间中内容覆盖至模式空间;G:将当前保持空间中内容追加至模式空间;n:提前读取下一行,覆盖模型空间前一行;N:追加下一行到模式空间,同时将两行看做一行,但是两行之间依然含有\n换行符;p:打印当前模式空间内容,追加到默认输出之后;P:打印当前模式空间开始至\n的内容,并追加到默认输出之前;x:将当前保持空间和模式空间内容互换;y:字符转换,转换前后的字符长度必须相同;&:表示已匹配字符串标记;
^ 匹配行开始,如:/^sed/匹配所有以sed开头的行。$ 匹配行结束,如:/sed$/匹配所有以sed结尾的行。. 匹配一个非换行符的任意字符,如:/s.d/匹配s后接一个任意字符,最后是d。* 匹配0个或多个字符,如:/*sed/匹配所有模板是一个或多个空格后紧跟sed的行。[] 匹配一个指定范围内的字符,如/[ss]ed/匹配sed和Sed。[^] 匹配一个不在指定范围内的字符,如:/[^A-RT-Z]ed/匹配不包含A-R和T-Z的一个字母开头,紧跟ed的行。\(..\) 匹配子串,保存匹配的字符,如s/\(love\)able/\1rs,loveable被替换成lovers。& 保存搜索字符用来替换其他字符,如s/love/**&**/,love变成**love**。\< 匹配单词的开始,如:/\<love/匹配包含以love开头的单词的行。\> 匹配单词的结束,如/love\>/匹配包含以love结尾的单词的行。x\{m\} 重复字符x,m次,如:/0\{5\}/匹配包含5个0的行。x\{m,\} 重复字符x,至少m次,如:/0\{5,\}/匹配至少有5个0的行。x\{m,n\} 重复字符x,至少m次,不多于n次,如:/0\{5,10\}/匹配5~10个0的行。
常用示例
以下示例,假设文件123.txt包含如下内容:
$ cat 123.txtonetwothreefourfivesixseveneightnineten
指定行号并打印它。因为sed处理后的默认操作也是将一行打印到stdout,所以会产生复制一行的效果:
$ sed '1p' 123.txtoneonetwothreefourfivesixseveneightnineten
p: 打印(通常与“-n”选项一起使用),如果同时指定行,表示打印指定行;如果不指定行,则表示打印所有内容;如果有非打印字符,则以ASCII码输出:
$ sed 'p' 123.txtoneonetwotwothreethreefourfourfivefivesixsixsevenseveneighteightnineninetenten$ sed -n 'p' 123.txtonetwothreefourfivesixseveneightnineten
也可以按步长指定行号并打印。例如,1~2表示每两行选择一次(从第一行开始每两行选择一次),1~3表示每三行选择一次:
$ sed '1~2p' 123.txtoneonetwothreethreefourfivefivesixsevenseveneightninenineten$ sed '1~3p' 123.txtoneonetwothreefourfourfivesixsevenseveneightninetenten
使用$来操作文件的最后一行:
$ sed '$p' 123.txtonetwothreefourfivesixseveneightninetenten
也可以选择多行(例如,sed '1,$p' 打印第一行和最后一行)。
任何按数字或位置选择的内容,都可以用感叹号 (!) 字符反转。如下示例将选择除第最后一行之外的所有行:
$ sed '$!p' 123.txtoneonetwotwothreethreefourfourfivefivesixsixsevenseveneighteightninenineten
=:打印行号(使用sed '='或sed -n '=;p'):
$ sed '=' 123.txt1one2two3three4four5five6six7seven8eight9nine10ten
上面的输出行号跟内容不在同一行,将输出通过管道传给另一个sed命令处理就完美了:
$ sed '=' 123.txt | sed 'N;s/\n/: /'
1: one
2: two
3: three
4: four
5: five
6: six
7: seven
8: eight
9: nine
10: ten
# 备注:
# =-代表行号
# N-追加下一行至当前处理行的后面,组成一个新行来处理
# s/\n/: /-替换,这里是将换行符/n替换为:
$ sed -n 'l' 123.txtone$two$three$four$five$six$seven$eight$nine$ten$
sed -n '1,3p' 123.txt #打印一到三行sed -n '3,$p' 123.txt #打印三到最后一行sed -n '$=;$p' 123.txt #打印最后一行显示行号sed -n '1, +3p' 123.txt #打印1之后的连续3行,即1-4行sed '3q' 123.txt #打印前3行信息后退出,q表示退出sed -n 'p;n' 123.txt #打印奇数行; n表示移动到下一行sed -n 'n;p' 123.txt #打印偶数行sed -n '2,${n;p}' 123.txt #从第二行开始,n移动下一行,p打印,表示打印奇数行sed -n '2,${p;n}' 123.txt #从第二行开始,n移动下一行,p打印,表示打印偶数行
$ sed -n ' /th/p' 123.txt #//搜索包含th的行进行打印,区分大小写
three
$ sed -n ' /^f/p' 123.txt #搜索以f开头的行进行打印
four
five
$ sed -n '/ne$/p' 123.txt #打印以ne结尾的行
one
nine
$ sed -n '/tw\|th/p' 123.txt#搜索包含tw或者th的行进行打印
two
three
$ sed -n '2,/th/p' 123.txt #从第二行开始打印到第一个包含th的行
$ sed -nr '/re{1,}e/p' 123.txt #-r表示支持正则表达式
three
sed 'd' 123.txt #不指定行号,全部删除sed '3d' 123.txt #删除第3行sed '2,4d' 123.txt #删除2-4行sed '$d' 123.txt #删除最后一行sed '/^$/d' 123.txt #删除空行sed '/th$/d' 123.txt #删除包含th字符的行sed '/th$/!d' 123.txt #不删除包含nologin的行sed '/se/,/te/d' 123.txt #遇到twelve开启删除,遇到fifteen关闭删除