sed文本处理工具
·sed是一种非交互式的流编辑器,默认情况下,sed并不会改变原文件本身,而只是对流经sed命令的文本进行修改,
并将修改后的结果打印到标准输出中(也就是屏幕)。
·sed可做的编辑动作包括删除、查找替换、添加、插入、从其他文件中读入数据等。
·sed命令常用的场景包括以下一些:
1.常规编辑器编辑困难的文本。
2.太过庞大的文本。
3.有规律的修改文本。(比如全文替换)
注意:要想保存修改后的文件,必须使用重定向生成新的文件。如果想修改源文件本身则需要使用“-i”参数。
演示文件:
vi sed.txt
this is line1,this is First line
this is line2,the Second line,Empty line followed
this is line3,this is Third line
this is line4,this is Fifth line
使用sed修改文件流的方式如下:
sed [options] 'command' file
#options是sed可以接受的参数
#command是sed的命令集(一共25个)
#使用-e参数和分号连接多编辑命令
#该参数本身只是sed的一个简单参数,表示将下一个字符串解析为sed编辑命令
#一般情况下可以忽略,但是当sed需要传递多个编辑命令时该参数就不能少了
#下面的例子就是演示了在将this改为That的同时,还要将line改为LINE
#两个编辑命令前都要使用-e参数,如果有更多的编辑需求,以此类推即可
如:sed -e 's/this/That/g' -e's/line/LINE/g' sed.txt
#上面命令可以用分号改写为:
sed 's/this/That/g;s/line/LINE/g' sed.txt
#如果需要直接修改文件,加-i参数
sed -i -e 's/this/That/g' -e's/line/LINE/g' sed.txt
1.删除文件内容
#将file的第一行删除后输出到屏幕
sed '1 d' sed.txt
#由于sed默认不修改原文件,如果希望保存修改后的文件则需用重定向
sed '1 d' sed.txt > saved_file
#如果想直接修改原文件,使用-i参数,不会有任何输出,直接删除了原文件的第一行
sed -i '1 d' sed.txt
#删除指定范围的行(第1行到第3行)
sed '1,3 d' sed.txt
#删除第1行到最后行
sed '1,$d' sed.txt
#删除最后一行
sed '$d' sed.txt
#删除指定范围以外的行(只保留第5行)
sed '5!d' sed.txt
#删除包含Empty的行
sed '/Empty/d' sed.txt
#删除空行
sed '/^$/d' sed.txt
2.查找替换
使用s命令可将查找到的匹配文本内容替换为新的文本
#s命令用于替换文本,本例中使用LINE替换line
#请注意每一行只有第一个line被替换了,默认情况下只替换第一次匹配到的内容
sed 's/line/LINE/' sed.txt
#把每行的第2个line替换为LINE
sed 's/line/LINE/2' sed.txt
#s命令利用g选项,可以完成所有匹配值的替换
sed 's/line/LINE/g' sed.txt
#只替换开头的this为that
sed 's/^this/that/' sed.txt
3.字符转换
使用y命令可以进行字符转换,其作用为将一系列字符逐个的变换为另外一系列字符,基本用法如下:
#该命令会将file中的O转换为N、L转换为E、D转换为W
#注意转换字符和被转换字符的长度要相等,否则sed无法执行,批量替换文本中的字符
sed 'y/OLD/NEW/' file
#下面的命令演示了将数字1转换为A,2转换为B,3转换为C,4转换为D的用法
sed 'y/1234/ABCD/' sed.txt
4.插入文本
使用i或a命令插入文本,其中i代表在匹配行之前插入,而a代表在匹配行之后插入,示例如下:
#使用i在第二行前插入文本
sed '2 i Insert' sed.txt
#使用a在第二行后插入文本
sed '2 a Insert' sed.txt
#在匹配行的上一行插入文本
sed '/Second/i\Insert' sed.txt
5.读入文本
使用r命令可从其他文件中读取文本,并插入匹配行之后,示例如下:
#将/etc/passwd中的内容读出到sed.txt空行之后
sed '/^$/r /etc/passwd' sed.txt
6.打印文件
使用p命令可进行打印,这里使用sed命令时一定要加-n参数,表示不打印没关系的行。简单来说,打印操作
是删除操作的“逆操作”。下面使用演示来具体说明:
#打印出文件中指定的行
sed -n '1 p' sed.txt
#将the替换成THE
#sed实际处理了第二行,其他几行由于没有匹配所以并未真正处理,但是sed的工作原理是基于流的,所以所有
流过的行都打印出来了
sed 's/the/THE/' sed.txt
输出了文本中所有的内容
#使用p命令,则只打印实际处理过的行,简化了输出(使用-n参数)
sed -n 's/the/THE/p' sed.txt
7.写文件(操作前确认是否有同名文件,保存的文件会覆盖原有的同名文件)
sed本身默认并不改写原文件,而只是对缓冲区的文本做了修改并输出到屏幕。所以想保存文件,除了之前提到
的两种方法外(使用重定向或-i参数),还可以使用w命令将结果保存到外部指定文件。示例如下:
sed -n '1,2 w output' sed.txt
加-n参数不输出到屏幕,不加-n参数会将文件所有内容输出到屏幕,
8.sed脚本
在平日的工作中,我们可能需要定期对一些文件做分析操作,这种例行的工作往往有一定的“标准化”的操作,比如
说先去除文件中所有的空行,然后再全部替换某些字符等,这种过程类似于生产线上程式化的流水作业。事实上,
可以把这些动作静态化的写到某个文件中,然后调用sed命令并使用-f参数指定该文件,这样就可以将这一系列动作
“装载”并应用于指定文件中,这无疑加快了工作效率,这种文件就是sed脚本。请观察下面的sed脚本:
#该sed脚本的作用是将全文的this改为THAT,并删除所有空行
vi sed.rules
s/this/THAT/g
/^$/d
#使用-f参数指定脚本并应用于sed.txt
sed -f sed.rules sed.txt
9.高级替换
·替换匹配行的下一行
想要修改匹配行的下一行,就要使用n命令了。该命令的作用在于读取匹配行的下一行,然后再用n命令后的编辑指令
来处理该行。在下面的sed.txt文件中有一行空白行,现在想将该空格行的下一行中的line改为LINE,而文本中其他
的部分不变,操作如下:
sed '/^$/{n;s/line/LINE/g}' sed.txt