Sed
BSD sed vs GNU - 它能夠嵌套匹配嗎?
這在任何 Linux 上都非常有效:
$ echo foo bar | sed -n '/foo/{/bar/{;p;}}' foo bar
但是在 OSXs 古老的 BSD 變體上失敗了:
❯ echo foo bar | sed -n '/foo/{/bar/{;p;}}' sed: 1: "/foo/{/bar/{;p;}}": extra characters at the end of } command
我錯過了一些神奇的咒語嗎?有沒有辦法以便攜的方式寫這個?
我不想不得不恢復到
grep | grep | grep
命令管道。更新:這裡的代表很低,所以不能投票,但感謝所有回复者的深思熟慮的建議。
sed
編輯命令應以換行符;
或文字換行符終止。GNUsed
對此非常寬容。你的腳本:
/foo/{/bar/{;p;}}
擴展:
/foo/{ /bar/{ p } }
這將作為輸入到through的
sed
腳本工作。sed``-f
如果我們確保用
;
(僅在命令和命令組的末尾需要)替換換行符,{...}
以便我們可以在命令行上使用它,我們得到/foo/{/bar/{p;};}
這適用於 OpenBSD
sed
(由於;
缺少第二個,原版沒有)。在這種特殊情況下,這可以進一步簡化為
/foo/{/bar/p;}