这在任何 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
馈送到sed
through的脚本来工作-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