首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >sed:删除多个模式匹配之间的项目(贪婪问题)

sed:删除多个模式匹配之间的项目(贪婪问题)
EN

Stack Overflow用户
提问于 2022-02-11 22:45:38
回答 2查看 64关注 0票数 1

所以我花了几个小时看类似的文章

我有一个行,我想保留开始,然后手术分离匹配模式后,到字符串的末尾。

例如,这里是原始行(很容易只关注一行):

代码语言:javascript
运行
复制
ltm pool gateway_ping { description "healthcheck pool" load-balancing-mode least-connections-node members { 10.100.100.4:icmp { address 10.100.100.4 session monitor-enabled state up } server2name:https { address 1.1.1.1 session monitor-enabled state up } } monitor Pingmonitor

这缩短并隔离了这个名字,就像我在努力:

cat config.txt | sed -e 's/^ltm \(pool .*\) { .*members { /\1 members /'

给我这个:

代码语言:javascript
运行
复制
pool gateway_ping members 10.100.100.4:icmp { address 10.100.100.4 session monitor-enabled state up } server2name:https { address 1.1.1.1 session monitor-enabled state up } } monitor Pingmonitor

现在,将结果传递到另一个sed,并以某种方式消除每个大括号实例之间的任何内容。

代码语言:javascript
运行
复制
{ address 10.100.100.4 session monitor-enabled state up }
{ address 1.1.1.1 session monitor-enabled state up }

补充如下:

| sed -e 's/{ address .* } / /g'

最后,我理发了,第一次比赛是正确的,但把其他的都吹掉了:

代码语言:javascript
运行
复制
pool gateway_ping members 10.100.100.4:icmp monitor Pingmonitor }

我真的需要那里的其他成员--这句话应该是:

代码语言:javascript
运行
复制
pool gateway_ping members 10.100.100.4:icmp server2name:https monitor Pingmonitor }

我可以摆脱监督屏}我只是被困在如何不让SED贪婪和吹熄所有的比赛到最后的支柱.我想让它停在第一根支撑处.然后继续单独匹配。

我想我可能是通过描述它来谋杀这个的。希望我没有失去观众:-)

EN

回答 2

Stack Overflow用户

发布于 2022-02-12 00:47:23

使用sed

代码语言:javascript
运行
复制
$ sed 's/[^ ]* \([^{]*\).*\(members\) {\([0-9.]*[^{]*\)[^}]*}\([^{]*\).*} \(}\)\(.*\)/\1\2\3\4\6 \5/' file
pool gateway_ping members 10.100.100.4:icmp  server2name:https  monitor Pingmonitor }
票数 1
EN

Stack Overflow用户

发布于 2022-02-12 14:36:30

代码语言:javascript
运行
复制
var='ltm pool gateway_ping { description "healthcheck pool" load-balancing-mode least-connections-node members { 10.100.100.4:icmp { address 10.100.100.4 session monitor-enabled state up } server2name:https { address 1.1.1.1 session monitor-enabled state up } } monitor Pingmonitor'

# with GNU awk
awk -F' *{ *' '
    /^ltm pool/{
        $0 = gensub(/^ltm (pool \w+) .* (members) {/, "\\1 \\2", "1")
        for(i=2; i<=NF-1; i++) sub(/.* /, "", $i)
        sub(/ address.*} }/, "")
    }
    ($1=$1)
' <<<"${var}"

### output:
pool gateway_ping members 10.100.100.4:icmp server2name:https monitor Pingmonitor

# with GNU sed
sed -nE '
    s/ \{ address( \S+){5} \}//g
    s/ +\}//;s/^ltm (pool \S+) \{ .* (members) \{/\1 \2/p
' <<<"${var}"

### output:
pool gateway_ping members 10.100.100.4:icmp server2name:https monitor Pingmonitor

这些对你有帮助吗?如果你想的话,我可以回来编辑答案,并给出一些解释。

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

https://stackoverflow.com/questions/71087322

复制
相关文章

相似问题

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