Sed

BSD sed vs GNU - 它能夠嵌套匹配嗎?

  • May 17, 2018

這在任何 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;}

引用自:https://unix.stackexchange.com/questions/444189