shell脚本四剑客--sed的应用

Posted 互联网老辛

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了shell脚本四剑客--sed的应用相关的知识,希望对你有一定的参考价值。

sed的介绍

sed是Linux下一款功能强大的非交互流式文本编辑器,可以对文本文件进行增、删、改、查等操作,支持按行、按字段、按正则匹配文本内容,灵活方便,特别适合于大文件的编辑

sed在处理文本时是逐行读取文件内容,读到匹配的行就根据指令做操作,不匹配就跳过

需要注意,sed 所做的修改并不会直接改变文件的内容(如果是用管道符接收的命令的输出,则连文件都没有),而是把修改结果只显示到屏幕上,除非使用"-i"选项才会直接修改文件。

大多数小伙伴之所以觉得难,是因为sed 拥有的参数太多,实际上,我们只要学会以下参数就可以。

sed的参数导图

常用选项:

-n:使用安静(silent)模式。在一般 sed 的用法中,所有来自 STDIN的资料一般都会被列出到萤幕上。
    但如果加上 -n 参数后,则只有经过sed 特殊处理的那一行(或者动作)才会被列出来。
    
-e:直接在指令列模式上进行 sed 的动作编辑;

-f:直接将 sed 的动作写在一个档案内, -f filename 则可以执行 filename 内的sed 动作;

-r:sed 的动作支援的是延伸型正规表示法的语法。(预设是基础正规表示法语法)

-i:直接修改读取的档案内容,而不是由萤幕输出。

常用命令:
a:新增, a 的后面可以接字串,而这些字串会在新的一行出现;
c:取代, c 的后面可以接字串,这些字串可以取代 n1,n2 之间的行;
d:删除,因为是删除,所以 d 后面通常不接任何字符;
i:插入, i 的后面可以接字串,而这些字串会在新的一行出现(目前的上一行);
p:列印,亦即将某个选择的资料印出。通常 p 会与参数 sed -n 一起运作;
s:取代,可以直接进行取代的工作!通常这个 s 的动作可以搭配正规表示法!例如 1,20s/old/new/g!
g:是行内进行全局替换

sed工具实例

2.1 替换test.txt文本中old为new:

sed 's/old/new/g' test.txt

2.2 打印test.txt文本第一行至第三行:

sed -n '1,3p' test.txt

2.3 打印test.txt文本中首行和尾行:

sed -n '1p;$p' test.txt

2.4 删除test.txt第一行至第三行;删除匹配行至最后一行:

sed '1,3d' test.txt
sed '/测试/,$d' test.txt   

2.5 删除test.txt最后6行;删除最后一行:

for i in `seq 1 6`;do sed -i '$d' test.txt;done;
sed '$d' test.txt

2.6 在test.txt查找测试所在行,并在其下一行添加word字符,a表示在其下一行添加字符串:

sed '/测试/aword' test.txt

2.7 在test.txt查找测试所在行,并在其上一行添加word字符,i 表示在其上一行添加字符串:

sed '/测试/iword' test.txt

2.8 在test.txt查找以测试结尾的行尾添加字符串word,$表示结尾标识,&在Sed中表示添加:

sed 's/测试$/&word/g' test.txt

2.9 在test.txt查找测试的行,在其行首添加字符串word,^表示起始标识,&在Sed中表示添加:

sed '/测试/s/^/&word/' test.txt

2.10 多个sed命令组合,使用-e参数:在含测试字符的行首加1.并在结尾是检测字符处加.

sed -e '/测试/s/^/&1./' -e 's/检测$/&./g' test.txt

2.11 多个sed命令组合,使用分号“;”分割:

sed -e '/测试/s/^/&1./;s/检测$/&./g' test.txt

2.12 Sed读取系统变量,变量替换:

WEBSITE=www.test.net
sed "s/测试/$WEBSITE/g" test.txt

2.13 修改Selinux策略enforcing为disabled:

sed -i '/SELINUX/s/enforcing/disabled/g' /etc/selinux/config
sed -i '/SELINUX/!s/enforcing/disabled/g' /etc/selinux/config
查找/SELINUX/行,然后将其行enforcing值改成disabled、!s表示不包括SELINUX行

2.14 打印文件的行号

[root@itlaoxin41 ~]# sed -n '$=' /etc/passwd
44

总结

带的学员越多,越发现sed最难的地方不是知识本身,而是畏难情绪,总觉得一个命令弄这么多参数,这可怎么学啊。
实际上每个参数多练一练,还是很容易学会的。

以上是关于shell脚本四剑客--sed的应用的主要内容,如果未能解决你的问题,请参考以下文章

SHELL编程四剑客练习--sed

shell 编程四剑客简介 find sed grep awk(微信公众号摘抄)

shell 编程四剑客之SED

shell 脚本——第七节课 三剑客之sed语句

Shell编程三剑客之sed

shell脚本江湖秘籍只传有缘人——流编辑器“三剑客”之sed命令