BSD sed vs GNU - 它能够嵌套匹配吗?

BSD sed vs GNU - 它能够嵌套匹配吗?

这在任何 Linux 上都能完美运行:

$ echo foo bar | sed -n '/foo/{/bar/{;p;}}'
foo bar

但在 OSX 古老的 BSD 变体上失败了:

❯  echo foo bar | sed -n  '/foo/{/bar/{;p;}}' 
sed: 1: "/foo/{/bar/{;p;}}": extra characters at the end of } command

我是不是错过了什么神奇的咒语?有没有办法以可移植的方式编写这个?

我不想恢复到grep | grep | grep命令管道。

更新:这里的代表很低,所以不能投票,但感谢所有回复者深思熟虑的建议。

答案1

编辑命令应以换行符或文字换行符sed终止。 ;GNUsed对此非常宽容。

你的脚本:

/foo/{/bar/{;p;}}

扩展:

/foo/{
    /bar/{
        p
    }
}

这将作为sed馈送到sedthrough的脚本来工作-f

如果我们确保将换行符替换为;(仅在命令和命令组的末尾需要{...}),以便我们可以在命令行上使用它,我们得到

/foo/{/bar/{p;};}

这适用于 OpenBSD sed(原来的版本不适用,因为;缺少第二个)。

在这个特殊情况下,可以进一步简化为

/foo/{/bar/p;}

答案2

这似乎适用于 BSD sed

$ echo -e "foo bar\nfoo\nbar" | sed -n '/foo/{/bar/p;}'
foo bar

两层嵌套也是如此:

$ echo -e "foo bar\nfoo\nbar" | sed -n '/foo/{/bar/{p;};}'
foo bar

相关内容