读取匹配的行的下一行,读取之前依旧会输出模式空间里的行并且清空,如果下一行是最后一行则立刻退出,之后命令不在执行。流程大致如下:
sed基础
s 搜索替换命令
s命令是我们最常用的命令,"s"命令的语法格式为:其中"/"可以替换成任意其他单个字符。 s/REGEXP/REPLACEMENT/FLAGS
它使用 REGEXP去匹配行,将匹配到的那部分字符替换成 REPLACEMENT。FLAGS是 "s"命令的修饰符,常见的有"g"、"p"和"i"或"I"。
"g":表示替换行中所有能被 REGEXP匹配的部分。不使用 g时,默认只替换行中 的第一个匹配内容。此外,"g"还可以替换成一个数值 N,表示只替换行中第 N个 被匹配的内容。
"p":输出替换后模式空间中的内容。
"i"或"I":REGEXP匹配时不区分大小写。
[root@lbaby ~]# sed -n 's/root/&super/p' /etc/passwd
rootsuper:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/rootsuper:/sbin/nologin
不使用g的时候值替换行中匹配到的第一个
[root@lbaby ~]# sed -n 's/root/&super/pg' /etc/passwd
rootsuper:x:0:0:rootsuper:/rootsuper:/bin/bash
operator:x:11:0:operator:/rootsuper:/sbin/nologin
插入追加修改
[a|i|c] string
将string队列到内存中,当有输出动作的时候追上输出流进行追加,插入或替换然后进行输出
sed '/root/a\superman' /etc/passwd 在匹配到的行的下一行添加指定内容
[root@lbaby ~]# sed '/root/a\superman' /etc/passwd
root:x:0:0:root:/root:/bin/bash
superman
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
superman
……
sed '/root/i\superman' /etc/passwd 匹配到的行的上一行添加
[root@lbaby ~]# sed '/root/i\superman' /etc/passwd
superman
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
superman
operator:x:11:0:operator:/root:/sbin/nologin
sed '/root/c\superman' /etc/passwd 代替匹配到的行
[root@lbaby ~]# sed '/root/c\superman' /etc/passwd
superman
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
superman
之前我们用到的sed命令都是一行一行的进行处理文本的,不过有些时候单行处理可能并不能满足我们的需要,所以sed还提供了多行模式,多行模式的命令主要有NPD这三个,
N:读取匹配到的行的下一行追加至模式空间
P:打印模式空间开端至\n内容,并追加到默认输出之前
D:如果模式空间包含换行符,则删除直到第一个换行符的模式空间中的文本, 并不会读取新的输入行,而使用合成的模式空间重新启动循环。如果模式空间 不包含换行符,则会像发出d命令那样启动正常的新循环
首先还是先看一下N命令的大致流程图,P和D命令在懂了N命令之后也容易理解。
需要注意的是,之所以叫多行模式是因为可以存放不止两行,如下示例: