我有一个文件如下
NAME(BOLIVIA) TYPE(SA)
APPLIC(Java) IP(192.70.xxx.xx)
NAME(BOLIVIA) TYPE(SA)
APPLIC(Java) IP(192.71.xxx.xx)
我正在尝试使用 sed 提取值 NAME 和 IP:
cat file1 |
sed ':a
N
$!ba
s/\n/ /g' | sed -n 's/.*\(NAME(BOLI...)\).*\(IP(.*)\).*/\1 \2/p'
但是,我只得到输出:
NAME(BOLIVIA) IP(192.71.xxx.xx)
我想要的是:
NAME(BOLIVIA) IP(192.70.xxx.xx)
NAME(BOLIVIA) IP(192.71.xxx.xx)
如果有人能指点我所缺少的,我将不胜感激。
TIA
最佳答案
您的第一个 sed
命令将文件重新格式化为一长行。您可以为此使用 tr -d "\n"
,但这不是问题所在。
问题在第二部分,.*
贪婪地尽可能多地吃,直到找到最后一个匹配项。
你的解决方案可以用丑陋的东西“修复”
# Do not use this:
sed -zn 's/[^\n]*\(NAME(BOLI...)\)[^\n]*\n[^\n]*\(IP([^)]*)\)[^\n]*/\1 \2/gp' file1
可能的解决方案:
cat file1 | paste -d " " - - | sed -n 's/.*\(NAME(BOLI...)\).*\(IP(.*)\).*/\1 \2/p'
# or
grep -Eo "(NAME\(BOLI...\)|IP\(.*\))" file1 | paste -d " " - -
# or
printf "%s %s\n" $(grep -Eo "(NAME\(BOLI...\)|IP\(.*\))" file1)
关于sed - 多行匹配模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64937799/