sed:删除字符串之间的文本,直到第一次出现另一个字符串

Mar*_*oen 4 regex sed

想象一下,我有类似以下文字的内容:

2012 年和 2013 年快速的棕狐跳跃

我希望从“fox”中删除包括四个数字在内的部分,但只在第一次出现时删除,所以我最终得到:

快速棕色和 2013

有点像这样...:

回声“快速的棕色狐狸在2012年和2013年跳跃”\
   | sed "s/fox.*\([0-9]\{4\}\)//g"

...带给我:

快速的棕色

所以它删除了所有内容,包括最后一次出现的四个数字。

有任何想法吗?

cho*_*oba 6

sed(“基本”和“扩展”版本)使用的 POSIX 正则表达式不支持非贪婪匹配。(尽管有一些变通方法,例如使用[^0-9]*代替.*,但如果输入变化很大,它们就会变得不可靠。)

您可以通过使用?非贪婪量词在 Perl 中实现:

echo "The quick brown fox jumps in 2012 and 2013" \
   | perl -pe 's/fox.*?([0-9]{4})//g'
Run Code Online (Sandbox Code Playgroud)

您可能还希望删除额外的空间。