一、sed语法格式和选项

sed(Stream Editor)流编辑器,对标准输出或文件逐行处理。

(1)stdout | sed [option] "pattern command"

(2)sed [option] "pattern command" file

-n:只打印模式匹配行

-e:进行多项编辑

-f:编辑动作保存在文件中,指定文件执行

-r:支持扩展正则表达式

-i:直接修改文件内容

下面为例子:--------------------------------------------

‘p’为print打印command,只有此命令会把原行和匹配的都打印出来,故会重复两遍,所以我们要加上参数。

【Shell脚本】sed命令_第1张图片

-e对有多项编辑的时候使用

image.png

实际工作中有的命令特别复杂,我们把它保存在一个文件里,我们在命令行指定-f使用文件即可

【Shell脚本】sed命令_第2张图片

上面的-e两个选项,也可以用一个扩展正则表达式来匹配

image.png

参数s:替换文本,

s/pattern-to-find/replacement-pattern/[g p w n]

后面不加参数是将第1个查到的替换,若加g表明全局替换。但此时并不会影响原文件。想要修改原文件要用-i

【Shell脚本】sed命令_第3张图片

【Shell脚本】sed命令_第4张图片


二、sed中pattern详解

10command:匹配到第10行

10,20command:匹配从第10行开始,到第20行结束

10,+5command:匹配从第10行开始,到第15行结束

/pattern1/command:匹配到pattern1的行,可以在字符串也可以是正则表达式

/pattern1/,/pattern2/command:匹配到pattern1的行开始,到匹配到pattern2的行结束

10,/pattern1/command:匹配从第10行开始,到匹配到pattern1的行结束

/pattern1/,10command:匹配到pattern1的行开始,到第10行匹配结束

【Shell脚本】sed命令_第5张图片

pattern里转义字符

【Shell脚本】sed命令_第6张图片

【Shell脚本】sed命令_第7张图片


三、sed中编辑命令详解

p:打印

d:删除

a:行后追加一行 (固定写法中间加空格: a 追加内容)

i:行前追加一行

r:将后面指定文件的内容追加到匹配行后面

w:将匹配的内容写到指定文件里

s:修改(1)s/pattern/string/ 查找并将匹配行内的第一个匹配的替换

             (2)s/pattern/string/g 查找并全部替换

             (3)s/pattern/string/2g  同一行内,只替换从第2个开始到剩下所有的

             (4)s/pattern/string/ig 忽略大小写,全局替换

=:显示行号

&:反向引用,只前面匹配的变量

下面为例子:--------------------------------------------

删除匹配的行

【Shell脚本】sed命令_第8张图片

a追加,a<空格><追加内容>,i行前增加,i<空格><增加内容>

【Shell脚本】sed命令_第9张图片

r读取文件内容然后行后增加文件内容,r<空格><文件名称>

【Shell脚本】sed命令_第10张图片

w写入文件内容到指定文件,文件若不存在则自动创建,w<空格><文件名称>

image.png

s后面不配合g,则只替换行内第一个匹配的

【Shell脚本】sed命令_第11张图片

s后面匹配g的情况

【Shell脚本】sed命令_第12张图片

=显示行号

【Shell脚本】sed命令_第13张图片

&反向引用,比如把test tuct等后面加个s

【Shell脚本】sed命令_第14张图片

练习:用脚本把某个文件的test全部替换成dev,注意脚本里pattern里用了变量,外面用双引号;或者外面使用单引号,变量也要用单引号

【Shell脚本】sed命令_第15张图片


四、脚本练习

练习1:---------------------------------------------

如下图的配置文件,实现输出section名称和里面对应配置项的个数

【Shell脚本】sed命令_第16张图片

实现脚本:定义两个函数,一个实现找到所有中括号里面的segname,一个实现根据segname计算出下面配置项的总和

【Shell脚本】sed命令_第17张图片

最终输出结果:

image.png

练习2:---------------------------------------------

删除配置文件中所有注释行和空行

【Shell脚本】sed命令_第18张图片

在配置文件中所有不以#开头的行前面加*符号,非#开头匹配用/^[^#]/

【Shell脚本】sed命令_第19张图片