棋子 · 5月20日

linux工具:sed编辑器使用进阶

上集回顾---linux工具:必须掌握的sed编辑器

3.sed操作进阶

3.1.多行命令

在使用 sed 编辑器的基础命令时,很多命令都是针对单行数据执行操作的。有时候我们需要跨行进行数据处理。

sed 编辑器提供了 3 个可用于处理多行文本的特殊命令。

ØN:加入数据流中的下一行,创建一个多行组进行处理。

ØD:删除多行组中的一行。

ØP:打印多行组中的一行。

3.1.1.next命令  

通常 sed 编辑器在移动到数据流中的下一行之前,会在当前行中执行完所有定义好的命令,而单行 next(n)命令会告诉 sed 编辑器移动到数据流中的下一行,不用再返回到命令列表的最开始位置。

单行 next 命令会将数据流中的下一行移入 sed 编辑器的工作空间(称为模式空间)。

多行版本的 next(N)命令则是将下一行添加到模式空间中已有文本之后。这样的结果是将数据流中的两行文本合并到同一个模式空间中。文本行之间仍然用换行符分隔,但 sed 编辑器现在会将两行文本当成一行来处理

sed '/aa/ {n;d}' data10.v 命令删除了文件匹配aa行的下一行

sed '/aa/ {N;d}' data10.v 命令删除了文件的第一行和第二行    

sed '/aa/ {N;s/\n/ /}' data10.v 命令将第一行和第二行中的跨行符替换成了空格

image.png

sed 'N; s/aa. * xxx/new line/' data10.v 使用N 命令将aa所在行与下一行合并,即使语句内出现了换行,仍然可以查找到aa和xxx字符,因此能够将两行替换成new line。

image.png

sed 'N; s/aa.*\nxxx/new line1\nnew line2/' data10.v 使用了跨行符\n去匹配字符,并且对匹配的两行完成替换,使用new line1替换第一行,使用new line2替换第二行    

image.png

3.1.2.删除命令 

单行删除命令(d)会在不同的行中查找aa和xxx,然后在模式空间中将两行都删掉。

多行删除(D)命令,该命令只会删除匹配模式中的第一行,即删除该行中的换行符及其之前的所有字符

sed 'N; /aa.* xxx/D' data10.v命令仅仅删除了第一行(包含aa)

sed 'N; /aa. * xxx/d' data10.v 命令删除了第一行(包含aa)和第二行(包含xxx)

image.png

sed ' /aa/ {N; /xxx/D}'  data10.v使用N和D删除匹配字符的上一行,是sed 'N; /aa. * xxx/D' data10.v命令的另外一种写法。

image.png

3.1.3.多行打印  

当出现多行匹配时,多行打印命令(P)只打印模式空间中的第一行。    

当出现多行匹配时,单行打印命令(p)会打印模式空间中的2行。

image.png

3.2.排除命令

感叹号(!)命令用于排除(negate)命令,也就是让原本会起作用的命令失效。

排除命令都是配合其他命令一起使用,例如删除命令、打印命令、替换命令、修改命令等。

排除命令本质上是对命令作用范围进行排除,例如 sed ‘2,3 d’ data11.v  是删除文件中的第二行和第三行,而 sed ‘2,3 !d’ data11.v 除了文件中的第二行和第三行不删除,其他行均删除。

sed '2 !d' data11.v 命令指示除了第二行不删除,其他行均删除

image.png

sed '2,3 !s/../xx/' data11.v 命令指示除了第二行和第三行不替换,其他行均替换

image.png

3.3.改变执行流程

通常,sed 编辑器会从脚本的顶部开始,一直执行到脚本的结尾(D 命令是个例外,它会强制 sed 编辑器在不读取新行的情况下返回到脚本的顶部)。sed 编辑器提供了分支和测试命令,可以改变脚本的执行流程。

3.3.1.分支

分支可以基于地址、地址模式或地址区间排除一整段命令,允许你只对数据流中的特定行执行部分命令,而其他行执行所有命令

分支(b)命令的格式如下:

[address] b [label]

label 参数定义了要跳转到的位置。如果没

有 label 参数,则跳过触发分支命令的行,继续处理余下的文本行。

sed '{2,3 b ; s/../xx/;}' data11.v  命令没有指定label参数,因此第二行和第三行不执行替换命令,而其他行执行替换命令

image.png

sed '{2,3 b jump1; s/. /& _replace1/; :jump1 s/. /& _replace2/}' data11.v 命令指定

第二行和第三行仅执行一次替换命令(s/. /& _replace2/),其他行执行2次替换命令,先执行第一次替换(s/. /& _replace1/),再执行第二次替换(s/. */& _replace2/)

image.png

3.3.2.测试命令  

测试命令(t)会根据替换命令的结果跳转到某个 label 处,命令格式为

[替换命令] t [label]

如果替换命令成功匹配并完成了替换,测试命令就会跳转到指定的标签。如果替换命令未能

匹配指定的模式,测试命令就不会跳转。

跟分支命令一样,在没有指定 label 的情况下,如果测试成功,sed 会跳转到脚本结尾。

image.png

3.4.替换的进阶用法

3.4.1.&符号代表匹配的内容  

&符号可以代表替换命令中的匹配内容

image.png

当模式匹配到单词 cat,"cat"就会成为替换后的单词。当模式匹配到单词 hat,"hat"就

会成为替换后的单词

3.4.2.使用部分匹配

&符号可以代表替换命令中的匹配的所有内容,但是有时候仅仅需要部分内容,我们可以使用圆括号()去匹配内容,并且使用\1、\2的格式调用内容    

在替换命令中使用圆括号时,必须使用转义字符,以此表明这不是普通的圆括号,而是

用于划分子模式

image.png

作者:IC小鸽
文章来源:IC芯视界

推荐阅读

更多IC设计干货请关注IC设计专栏。欢迎添加极术小姐姐微信(id:aijishu20)加入技术交流群,请备注研究方向。
推荐阅读
关注数
17715
内容数
1281
主要交流IC以及SoC设计流程相关的技术和知识
目录
极术微信服务号
关注极术微信号
实时接收点赞提醒和评论通知
安谋科技学堂公众号
关注安谋科技学堂
实时获取安谋科技及 Arm 教学资源
安谋科技招聘公众号
关注安谋科技招聘
实时获取安谋科技中国职位信息