sed编辑器又称为流编辑器(stream editor),是根据预先提供的一组规则,实现自动格式化、插入、修改或删除文本元素的命令行编辑器。此外还有一个命令行编辑器叫gawd,下次有机会再整理。
sed操作特点
- 格式上,命令两边要加单引号,后接待操作文本;
- 按行处理;
- 根据命令匹配文本行,进行编辑;
- 不修改原文件,新的内容输入到STDOUT(终端显示器)
在流编辑器将所有命令与一行数据匹配完毕后,它会读取下一行数据并重复这个过程。在流编辑器处理完流中的所有数据行后,它就会终止。
- 在这里交代下后面的代码可能会用到的文本文件
cat test1.txt
Tom is a good cat.
#
cat test2.txt
This is a test of the test script.
This is the second test of the test script.
#
cat test3.txt
Tom is a good cat.
Tom is a good cat.
Tom is a good cat.
#
cat test4.txt
Tom is a good cat.
Jerry is a good mouse.
#
cat test5.txt
Tom is a good cat.1
Tom is a good cat.2
Tom is a good cat.3
Tom is a good cat.4
一、替换操作 substitude,s
1、基本用法
sed 's/good/bad/' test1.txt
Tom is a bad cat.
如上,s
命令可以把用斜线指定的第二个字符串替换掉第一个字符串。
2、每行执行多处替换
2.1、-e 选项 读取多命令
sed -e 's/Tom/Jerry/; s/cat/mouse' test1.txt
如上,即可实现两个命令均作用到文件的每行数据上;注意多命令间要加分号隔开。
如果不想用分号,还有另外一种写法--
sed -e '
s/Tom/Jerry/
s/cat/mouse/' test1.txt
- 只要输入第一个单引号,就标志sed程序脚本的开始,bash将提示输入更多的命令;
- 一定要在封尾单引号所在行结束命令。
2.2、-f 选项 读取文件命令
cat script.sed #加一个后缀,以示区别
s/Tom/Jerry/
s/cat/mouse/
- sed编辑器知道每一行都是一条单独的命令。
sed -f script.sed test1.txt
- 和在命令行输入命令一样,sed编辑器会从指定文件读取命令,并应用到数据文件的每一行里。
3、尾部标记四命令
3.1、一行存在多处目标模式
替换命令默认只替换每行出现的第一处目标,当然可以修改。
s/old/new/n
只替换每行中,第n次出现的目标。
sed 's/test/trial/2' test2.txt
This is a test of the trial script.
This is the second test of the trial script.
- 此处sed命令仅替换在第二次出现的目标。
3.2、替换全部
s/old/new/g
顾名思义,替换掉文本中所有的目标。
sed 's/test/trial/g' test2.txt
This is a trial of the trial script.
This is the second trial of the trial script.
3.3、只输出修改过的行
-n s/old/new/p
需要搭配选项 -n(禁止输出)
sed -n 's/second/first/p' test2.txt
This is the first test of the test script.
#这里就只有被修改的第二行被输出
3.4、另存修改行到指定文件
s/old/new/w filename
终端仍有正常输出, 但只有那些包含匹配模式的行才会被保存。
sed 's/second/first/w tmp.txt' test2.txt
This is a test of the test script.
This is the first test of the test script.
cat tmp.txt
This is the first test of the test script.
#这里被修改的第二行被存为单独一个文件
此外也可以直接将当前数据的目标行文本储存为指定文件,命令为
w
。如下
sed -n '1,2w tmp.txt' test4.txt
cat test5.txt
Tom is a good cat.1
Tom is a good cat.2
4、前部标记寻行命令
上述的替换模式还是逐行寻找,如果想要仅在目标行替换,那么在第一个引号规则首部加上相应的标记。
4.1、数字标记
sed '2s/good/bad/' test3.txt
Tom is a good cat.
Tom is a bad cat.
Tom is a good cat.
- 上述命令交代仅在第二行替换,此外还有其它相关用法
sed '2,3s/good/bad/' test3.txt #应该是指第2到3行
sed '2,$s/good/bad/' test3.txt # $美元符通常指代最后一行
4.2、文本模式
sed 'Jerry/s/good/bad/' test3.txt
Tom is a good cat.
Jerry is a bad mouse.
- 如上,sed首先会锁定文本中含有 Jerry 的文本行;然后进行后面的替换。文本模式往往搭配正则表达会有比较好的效果,详见下一节内容。
4.3、在目标行执行多处目标替换
sed '1{
s/Tom/Jerry/
s/cat/mouse/
}' test4.txt
- 在第一行,执行上述两处替换。
5、特殊的替换
这里的内容其实是原来小节的内容,因为没有用到s
命令。但是从效果来说,本质上都是替换,因此将其移到这里。
5.1 替换行文本
新行替换旧行
sed '2c\
Jerry is a good mouse.' test3.txt
Tom is a good cat.
Jerry is a good mouse.
Tom is a good cat.
- 将命令中的文本行替换掉原来第二行的内容,另外注意此处的符号为反斜线
\
5.2 替换单个字符
sed 'y/123/789/' test4.txt
Tom is a good cat.7
Tom is a good cat.8
Tom is a good cat.9
Tom is a good cat.4
- 注意命令为一一对应的关系,即1被替换成7;2被替换成8;3被替换成9。
- 此外要注意的是这是全局命令,会在全文中搜索目标字符,并进行替换。
二、删除操作 delete,d
- 一些标记意义可参考前面替换命令的有关学习
sed '2d' test4.txt #删除第二行
sed '2,4d' test4.txt
sed '/cat.1/d' test4.txt
值得注意的是,单独使用
'd'
是全部删除的效果
三、添加行文本
- 插入insert,i 在指定行前增加一个新行;
- 附加append,a 在指定行后增加一个新行。
sed '3i\
Jerry is a good mouse.' test4.txt #
#
Tom is a good cat.1
Tom is a good cat.2
Jerry is a good mouse.
Tom is a good cat.3
Tom is a good cat.4
-
3i\
表示在第三行前插入一行文本
sed '$a\
Jerry is a good mouse.' test4.txt
#
Tom is a good cat.1
Tom is a good cat.2
Tom is a good cat.3
Tom is a good cat.4
Jerry is a good mouse.
-
$a\
表示在尾行后附加一行文本
sed '1i\
Jerry is a good mouse.\
Jerry is a good mouse.' test4.txt
#
Jerry is a good mouse.
Jerry is a good mouse.
Tom is a good cat.1
Tom is a good cat.2
Tom is a good cat.3
Tom is a good cat.4
-
1i\
表示在首行添加两行文本。
特殊的插入,将另一个文本文件读入当前数据里。命令为
r
,如下例
sed '3r test4.txt' test5.txt
#
Tom is a good cat.1
Tom is a good cat.2
Tom is a good cat.3
Tom is a good cat.
Jerry is a good mouse.
Tom is a good cat.4
- 在test5.txt的第三行文本后插入test4.txt的两行文本。
四、打印输出
1、输出指定行文本
命令为p
,即替换标记里的那个p
命令;同样需要搭配 -n 选项
sed -n '2p' test4.txt #仅输出第二行
sed -n '/cat.3/p' test4.txt #仅输出目标文本模式的行文本
sed -n '/3/{
p
s/good/bad/p
}' test5.txt
#先显示第三行,再修改第三行
2、打印行号
sed '=' test5.txt
1
Tom is a good cat.1
2
Tom is a good cat.2
3
Tom is a good cat.3
4
Tom is a good cat.4
以上是有关sed编辑器的学习内容,此外gawk十一更高级的行编辑器(p404),之后再学习一下。参考教材为《R语言实战(第2版)》