首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >sed多行递归模式替换

sed多行递归模式替换
EN

Unix & Linux用户
提问于 2016-08-29 18:01:47
回答 2查看 738关注 0票数 4

根据以下投入:

代码语言:javascript
复制
serial0/0
SSL disabled
eth0/0
SSL enabled
SSL only
eth0/1
SSL disabled
bgroup0
SSL enabled
eth0/2
SSL disabled
eth0/3
SSL disabled
eth0/4
SSL disabled
bgroup1
SSL disabled
bgroup2
SSL disabled
bgroup3
SSL disabled
vlan1
SSL enabled
null
SSL disabled

我试图获得一个冒号分隔的列表,如果输入的下一行以"SSL“开头,它将被追加到前一行,因此输出如下:

代码语言:javascript
复制
serial0/0:SSL disabled
eth0/0:SSL enabled:SSL only
eth0/1:SSL disabled
bgroup0:SSL enabled
eth0/2:SSL disabled
eth0/3:SSL disabled
eth0/4:SSL disabled
bgroup1:SSL disabled
bgroup2:SSL disabled
bgroup3:SSL disabled
vlan1:SSL enabled
null:SSL disabled

正如您在这个理想输出的第二行中所看到的,应该考虑多行以"SSL“开头的情况。在经典sed指南的基础上,我提出了以下sed脚本:

代码语言:javascript
复制
sed -r '/^SSL/! {
        :again
        N
        s/(.*)\n(SSL.*)/\1:\2/
        t again
    }'

这对我来说很有意义,但返回以下输出:

代码语言:javascript
复制
serial0/0:SSL disabled
eth0/0
SSL enabled
SSL only
eth0/1:SSL disabled
bgroup0
SSL enabled
eth0/2:SSL disabled
eth0/3
SSL disabled
eth0/4:SSL disabled
bgroup1
SSL disabled
bgroup2:SSL disabled
bgroup3
SSL disabled
vlan1:SSL enabled
null
SSL disabled

知道我可能做错了什么吗?

EN

回答 2

Unix & Linux用户

回答已采纳

发布于 2016-08-29 18:07:18

一个简单得多的解决方案:

代码语言:javascript
复制
sed -z 's/\nSSL/:SSL/g'

-z说要使用NUL作为行分隔符--有效地使整个流显示为sed的一行。然后简单地将\nSSL序列替换为:SSL序列,有效地按照您希望的方式组合行。

票数 8
EN

Unix & Linux用户

发布于 2016-08-29 19:20:56

您可以使用任何sed风格来完成此操作,无需将整个文件读入内存,只需使用经典的N;P;D循环和分支:

代码语言:javascript
复制
sed ':b;$!N;s/\nSSL/:SSL/;tb;P;D' infile

这就引入了Next行,尝试sub妓女--如果成功的话,它将分支回:b cycle it Print,然后D删除到换行符,重新启动循环。

票数 6
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/306483

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档