sed高级用法
模式空间和保持空间
模式空间是sed命令中默认用于存储当前处理的文本行的缓冲区。当sed读取输入文件的一行时,该行会被存储在模式空间中。sed命令会对模式空间中的文本进行处理,可以使用各种sed命令对其进行编辑、替换、删除等操作。完成处理后,sed会将模式空间的内容输出到标准输出,并读取下一行进行处理。
保持空间是一个额外的缓冲区,用于存储临时数据或在处理多行文本时保存部分文本。可以使用sed的"H"命令将模式空间的内容复制到保持空间中,使用"g"命令将保持空间的内容复制回模式空间中。
h : 把模式空间中的内容覆盖至保持空间中
H :把模式空间中的内容追加至保持空间中
g : 把保持空间中的内容覆盖至模式空间中
G :把保持空间中的内容追加至模式空间中
n : 读取下一行覆盖模式空间中的行
N :读取下一行并追加到模式空间中的行后面,使用\n分隔
D :删除模式空间的第一行,不读入下一行
d :删除模式空间中的所有行,并读入下一行
多行删除
d和D的区别:
D
命令用于删除模式空间中的文本行的第一部分。它的工作方式是删除模式空间中的第一行,然后将剩余的文本行保留在模式空间中,继续进行后续的sed命令处理。如果在删除第一行后,模式空间中仍然有文本行,sed会返回到命令的开头重新处理模式空间中的文本行。这使得D
命令可用于处理多行文本。
d
命令用于删s匹配某个模式的文本行。
示例
[root@localhost ~]# cat llao
456
asrsae
zxcvz
plplp
Why are you so skilled?
pure "oxygen"
asd
[root@localhost ~]# sed '/^$/{N;/^\n$/d}' llao //使用d
456
asrsae
zxcvz
plplp
Why are you so skilled?
pure "oxygen"
asd
[root@localhost ~]# sed '/^$/{N;/^\n$/D}' llao //使用D
456
asrsae
zxcvz
plplp
Why are you so skilled?
pure "oxygen"
asd
多行打印
p
命令用于将匹配某个模式的文本行打印出来。
P
命令用于将模式空间中的文本行的第一部分打印出来。它的工作方式是将模式空间中的第一行打印出来,然后删除该行,保留剩余的文本行在模式空间中,继续进行后续的sed命令处理。如果在打印第一行后,模式空间中仍然有文本行,sed会返回到命令的开头重新处理模式空间中的文本行。这使得P
命令可用于处理多行文本。
示例
[root@localhost ~]# cat llao
456
asrsae
zxcvz
Why are you so skilled?
pure "oxygen"
asd
[root@localhost ~]# sed '/skilled?$/{N;/skilled?\n/{s/skilled?\n/skilled /;P}}' llao
456
asrsae
zxcvz
Why are you so skilled pure "oxygen"
Why are you so skilled pure "oxygen"
asd
[root@localhost ~]# sed '/skilled?$/{N;/skilled?\n/{s/skilled?\n/skilled /;P;D}}' llao
456
asrsae
zxcvz
Why are you so skilled pure "oxygen"
asd
互换保持空间和模式空间里的内容
h : 把模式空间中的内容覆盖至保持空间中
H :把模式空间中的内容追加至保持空间中
g : 把保持空间中的内容覆盖至模式空间中
G :把保持空间中的内容追加至模式空间中
追加就是不覆盖原来的文本,覆盖就会删除原来的文本
这边不一一展示,有例子可以很好说明
大写转换
[root@localhost ~]# cat llao //将skilled转为大写
456
asrsae
zxcvz
Why are you so skilled?
pure "oxygen"
asd
[root@localhost ~]# sed -r '/so .*\?/{h;s/.*so (.*)\?/\1/;y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/;G;s/(.*)\n(.*so ).*(\?)/\2\1\3/g}' llao
456
asrsae
zxcvz
Why are you so SKILLED?
pure "oxygen"
asd