Linux sed进阶

帅比萌擦擦* 提交于 2020-03-26 09:18:15
一、多行命令
在使用sed编辑器的基本命令时,所有的sed编辑器命令都是对单行数据执行操作。sed编辑器也可以对多行数据进行处理,包含了3个可用来处理多行文本的特殊命令。
1》N:将数据流中的下一行加进来创建一个多行组来处理。
2》D:删除多行组中的一行。
3》P:打印钓竿组中的一行。
1.单选的next命令
小写n命令会告诉sed编辑器移动到数据流下一文本行,而不用重新回到命令的最开始再执行一遍。通常sed编辑器会在移动到数据流中的下一文本行前,在这行上执行所有定义好的命令。
$ cat data4
This is the header line

This is data line

This is the last line
$ sed '/header/{n;d}' data4
This is the header line
This is data line

This is the last line
2.合并文本行
单行next命令会将数据流中的下一文本行移动到sed编辑器的工作空间(称为模式空间)。多行版本的next命令(用大写N)会将下一文本行加到已经在模式空间中的文本上。
这样的作用是将数据流中的两个文本行合并到同一个模式空间。文本行仍然用换行符分隔,但sed编辑器现在会将两行文本当成一行来处理。
$ cat data2
line1
line2
line3
line4
$ sed '/1/{N;s/\n/ /}' data2
line1 line2
line3
line4
3.多行删除命令
$ sed '/^$/{N;/data/D}' data4
This is the header line
This is data line

This is the last line
说明:sed编辑器脚本会查找空白行,如果找到了,则N命令,使下一文本行添加到模式空间。如果新的模式 空间中含有单词data,则D命令会删除模式空间中的前一行。
4.多行打印命令
多行打印(print)命令P沿用了同样的方法。它只打印多行模式空间中的第一行。这包括模式空间中直到换行符的所有字符。当用-n选项来阻止脚本输出时,它和显示文本的单行p命令的用法大同小异:
$ sed -n 'N;/head/p' data4
This is the header line
《空行》
二、保持空间
模式空间(pattern space)是一块活动缓冲区,在sed编辑器执行命令时,它会保存sed编辑器要检验的文本。但它并不是sed编辑器保存文本的唯一空间。
sed编辑器还利用了另一块缓冲区域,称做保持空间(hold space)。可以在处理模式空间中其他行时用保持空间来临时保存一些行。有5条命令用来保持空间。
h     将模式空间复制到保持空间     
H     将模式空间附加到保持空间
g     将保持空间复制到模式空间
G     将保持空间附加到模式空间
x     交换模式空间和保持空间的内容
 
$ sed -n '/1/{
> h
> p
> n
> p
> g
> p
> }' data2
line1
line2
line1
三、排除命令
感叹号命令(!)用来排除(negate)命令,也就是让原来会起作用的命令不起作用。
$ sed -n '/1/!p' data2
line2
line3
line4
四、改变流
通常,sed编辑器会从脚本的顶部开始执行命令并一直处理到脚本的结尾(D命令是个例外,它会强制sed编辑器返回到脚本的顶部,而不是读取新的行)。sed编辑器提供了一个方法来改变命令脚本的流,生成的结果类似于结构化编辑环境的结果。
1.跳转
跳转(branch)命令b的格式如下:
[address]b [label]
address参数决定了哪行或哪些行的数据会触发跳转命令。label参数定义了要跳转到的位置。如果没有加label参数,跳转命令会跳转到脚本的结尾:
$ sed '{2,3b; s/line/LINE/}' data2
LINE1
line2
line3
LINE4
2.测试
如果替换命令成功匹配并替换了一个模式,测试命令就会跳转到指定的标签。如果替换命令未能匹配指定的模式,测试命令就不会跳转。
[address]t [label]
跟跳转命令一样,在没有指定标签的情况下,如果没有测试成功,sed会跳转到脚本的结尾。
$ sed '{
s/1/1 match/
t
s/line/no match /
}' data2
line1 match
no match 2
no match 3
no match 4
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!