EZLippi-浮生志

SED教程

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
2
$ sed -e 's/aaa/AAA/g' -e 'w b.txt' a.txt
$ sed -e 's/aaa/AAA/g;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变量,如下所示:

bash
1
2
3
$ FROM="aaa"
$ TO="eee"
$ sed -e "s/$FROM/$TO/g" input.txt

脚本文件的使用

读取脚本文件执行,需要使用”-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
2
3
4
cat a.txt
sshd[12002]: Failed password from 192.168.19.22 port 334 ssh2
$ sed -n -e '/Failed password/s/.*Failed password from \([0-9.]*\) port .*/\1/p' a.txt
$ 192.168.19.22
🐶 您的支持将鼓励我继续创作 🐶