1.sed简介
Sed是一款流编辑工具,用来对文本进行过滤与替换操作,Sed通过一次仅读取一行内容来对某些指令进行处理后输出,所以Sed更适合于处理大数据文件。首先,Sed通过文件或管道读取文件内容,但Sed默认并不直接修改源文件,而是将读入的内容复制到缓冲区中,我们称之为模式空间(pattern space),所有的指令操作都是在模式空间中进行的,然后Sed根据相应的指令对模式空间中的内容进行处理并输出结果,默认输出至标准输出(即屏幕上)。
工作流程如图:
2.语法格式
Sed从文件中读取数据,如果没有输入文件,则默认对标准输入进程数据进行处理。
sed [选项]...{脚本指令} [输入文件]
命令参数:
- -n:使用安静(silent)模式。所有来自STDIN的数据一般都会被列出到终端上。但如果加上-n参数后,则只有经过sed 特殊处理的那一行(或者动作)才会被列出来(只打印模式空间中的内容);
- -e: 允许多个脚本指令被执行
- -f:直接将sed的动作写在一个文件内,-f filename则可以运行filename内的sed动作;
- -r:sed 的动作支持的是延伸型正规表示法的语法;
- -i:in place editing 直接修改读取的文件内容,而不是输出到终端;
3.脚本指令
脚本指令需要指定一个地址来决定操作范围,如果不指定,则默认对文件的所有行进行操作。
基本格式 :
[地址]命令
- a :append 新增, a的后面可以接字串, 新增到当前行的下一行。
- i : insert 插入, i 的后面可以接字串,插入到当前行的上一行;
- d :delete 删除,因为是删除,所以 d 后面通常不接任何咚咚;
- p :print 打印,亦即将某个选择的数据打印出来。通常 p 会与参数 sed -n 一起运行。
- s :substitute 替代,通常这个 s 的动作可以搭配正规表示法,例如 s/old/new/g ,后面的参数g: global 代表替换作用于全局的每一行。如果没有g,则至替换每行出现的第一个匹配字符。
更多的指令大全如图:
地址的匹配语法
4.常用操作小结
(1)插入
- 在第n行后插入
TYPE=Ethernet
sed '2a TYPE=Ethernet' test.txt
- 在第二行前插入
TYPE=Ethernet
sed '2i TYPE=Ethernet' test.txt
- 匹配到包含ONBOOT的行,并在其后添
加TYPE=Ethernet
sed '/ONBOOT/a TYPE=Ethernet' test.txt
(2)删除
删除指令需要注意以下几点:
(1)删除只能删除整行,如果删除部分需要用替换。
(2)删除指令用于删除匹配的行,而且删除命令还会改变sed脚本中命令的执行顺序。因为匹配的行一旦删除,模式空间将变为“空”,自然不会再执行sed脚本后续的命令。删除命令将导致读取新的输入行(下一行),而sed脚本中的命令则从头开始重新执行。
- 删除第二行
sed '2d ' test.txt
- 删除2-8行
sed '2,8d' test.txt
- 删除空行
/^$/d
(3)打印
- 打印文件的第3行
sed -n '3p' test.txt
- 打印奇数行
sed -n '1~2p' test.txt
(4)替换
指令格式:[address]s/pattern/replacement/flags
address为操作地址,s为替换指令,/pattern/匹配需要替换的内容,/replacement为替换的新内容。
Flags标记可以是:
replacement为字符串,用来替换与正则表达式匹配的内容。在replace部分,只有下列字符有特殊含义:
示例 :
(5)更改
注意更改是会把整行更改,替换只会替换匹配的内容。
- 将包含ONBOOT行的内容更改为ONBOOT=no
sed '/ONBOOT/c ONBOOT=no' test.txt
(6)执行多个指令
如果想要一次执行多个指令,主要有以下两种方法:
(1)使用分号隔开使用
sed 's/a/b/g;s/c/d/g' text.txt
(2)使用-e 选项
sed -e 's/yes/no/' -e 's/static/dhcp/' test.txt
5. 一些比较复杂的示例
- 把将样本文件中第二个替换为
样本文件:
[root@andrew Andrew]# cat test.txt
<html>
<title>First Web</title>
<body>Hello the World!<body>
</html>
指令文件:
[root@andrew Andrew]# cat sed.sh
/body/{
s///body/2
}
先匹配/body/
,然后替换成//body/,最后2 表示的是匹配该行的第二个字符串.后面的指令可以用花括号括起来。
执行结果:
[root@andrew Andrew]# sed -f sed.sh test.txt
<html>
<title>First Web</title>
<body>Hello the World!</body>
</html>
2.给每行前一个的h1,h2等添加<>,后一个h1,h2添加</>
样本文件:
[root@andrew Andrew]# cat test.txt
<html>
<title>First Web</title>
<body>
h1Helloh1
h2Helloh2
h3Helloh3
</body>
</html>
指令文件:
[root@andrew Andrew]# cat sed.sh
/h[0-9]/{
s//<&>/1
s//</&>/2
}
先匹配/h[0-9/
,然后替换成/<&>/1
,//<&>/2
,其中& 表示前面匹配的字符串,常用于在原有字符串上增加字符。
执行结果:
[root@andrew Andrew]# sed -f sed.sh test.txt
<html>
<title>First Web</title>
<body>
<h1>Hello</h1>
<h2>Hello</h2>
<h3>Hello</h3>
</body>
</html>
参考链接:https://blog.csdn.net/qq_37931597/article/details/86505723