SED是一个简单强大的文本处理工具,作为标准命令被收集到UNIX系的OS中,它将指定的文本逐行读入,根据给定的条件进行处理。把sed当做单行脚本使用,紧跟着-e选项,就能把处理的内容作为脚本记述下来,如果用-f选项,就可以读取事先准备的脚本文件。
一个简单的例子,下面的这条命令用于把input.txt中的每一行中的aaa替换成bbb,”g”表示全局替换,如果没有”g”则只替换第一次匹配到的结果。1
$ sed -e 's/aaa/bbb/g' input.txt > output.txt
sed的用法
s命令(字符串替换)
s命令用于把某个字符串替换成别的字符串,基本格式如下:
1 | $ sed -e 's/原字符串/替换后的字符串/标志' 输入.txt |
替换后的字符串省略时表示删除匹配的字符串,原字符串中含有”/“时,需要用”\”进行转义处理,也可以在”s”后面指定其他的分隔符,如下这条命令用于把/usr/local替换成很/usr:
1 | $ sed -e 's!/usr/local!/usr!g' 输入.txt |
替换后的字符串中可以用”&”符号来引用匹配到的字符串,比如下面这个例子中与”.*”匹配的字符串可以用”&”来引用,下面这个例子是在每行的前面加上”output”:
1 | $ sed -e 's/.*/output&/g' input.txt |
比如input.txt的内容为aaa bbb ccc,上一条命令的输出为
1 | output aaa bbb ccc |
sed默认会把替换后的结果输出来标准输出,可以加上-n命令来取消这个输出,如下所示:
1 | $ sed -n -e 's/aaa/AAA/g' a.txt |
如果想把替换后的结果写入到文件中,可以使用w命令,你可以用多一个-e来执行多个命令,或者在多个命令之间用分号分隔:
1 | $ sed -e 's/aaa/AAA/g' -e 'w b.txt' a.txt |
y命令(替换1个字符)
当希望把某个字符替换成另一个字符时可以用y命令,可以指定多个字符,比如’y/abc/xyz’命令用于把a->x,b->y,c->z,如下所示:
1 | $ sed -e 'y/abc/xyz/g' -e 'w b.txt' a.txt |
d命令(删除)
d命令用于删除指定行,比如’1,2d’用于删除1~2行,’2,$d’用于删除第二行开始所有的行
文件输出
除了可以用”>”重定向到文件,或者用’w’命令写文件,还可以用-i选项将处理结果覆盖到源文件中,
1 | $ sed -i -e 's/aaa/AAA/g' a.txt |
双引号和单引号
sed在指定命令时一般需要用单引号括起来,如果用双引号可以指定shell变量,如下所示:
1 | $ FROM="aaa" |
脚本文件的使用
读取脚本文件执行,需要使用”-f”选项
1 | $ sed -f 脚本文件 输入文件 |
高级命令
还可以在s命令之前指定要处理的行,比如下面这个命令只处理1到20行的内容:
1 | $ sed -e '1,20s/aaa/AAA/g' 输入文件 |
下面这个命令只处理包含”bbb”的行
1 | $ sed -e '/bbb/s/aaa/AAA/g' 输入文件 |
可以用”(“和”)“把一部分搜索内容括起来,然后用”\1”引用搜索到的这部分内容,比如下面这一行包含一个IP地址,我要把这个IP地址找出来:
1 | cat a.txt |