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



所以我花了几个小时看了类似的文章——是的,很有帮助,但不足以让我度过难关。

我有一行,我想保留它的开头,然后通过手术将匹配的模式隔离到字符串的末尾。

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

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 /'

给我这个:

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,并以某种方式消除括号的每个实例之间的任何内容

{ 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'

我最后剪了这个发型,这给了我第一场比赛的正确性,但把剩下的都吹了:

pool gateway_ping members 10.100.100.4:icmp monitor Pingmonitor }

我真的需要那里的其他成员——行应该是:

pool gateway_ping members 10.100.100.4:icmp server2name:https monitor Pingmonitor }

我可以摆脱监视器Pingmonitor}我只是被困在如何不让SED贪婪并把所有比赛都吹到最后一个支架上。。。我希望它在第一个端支架处停止。。。然后继续单独匹配。

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

使用sed

$ sed 's/[^ ]* ([^{]*).*(members) {([0-9.]*[^{]*)[^}]*}([^{]*).*} (})(.*)/12346 5/' file
pool gateway_ping members 10.100.100.4:icmp  server2name:https  monitor Pingmonitor }
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

这些对你有帮助吗?如果你愿意的话,我可以回来编辑一下答案。

最新更新