sed - 多行匹配模式

标签 sed

我有一个文件如下

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/

相关文章:

bash - 在 sed 的替换字符串中使用文件内容

csv - 如何限制 sed 仅替换出现在第一个右方括号之后的数据?

linux - 从文件中提取两个模式之间的线

javascript - 使用正则表达式替换函数调用

linux - 使用 awk 或 sed 替换 _ 之前的字符串

sed - 为什么备用定界符不能与sed -e '/pattern/s/a/b/'一起使用?

sed:用另一个字符替换多个句点

shell - Unix : saving a sed command in a variable, 回显它,然后执行它

linux - 如何只在某些字段上执行 awk 命令

linux - sed/awk/perl 格式化多个段落