【发布时间】:2014-07-26 06:33:54
【问题描述】:
如果 $PATH 中的条目包含给定字符串 foo,我将尝试删除该条目。例如PATH=/home/me/bin:/home/foo/bin:/usr/foo/bin:/bin 将变为PATH=/home/me/bin:/bin。我目前有
echo $PATH | perl -pe 's/:(.*?)foo(.*?):/:/g'
但这似乎删除了太多条目,即使我正在尝试使用非贪婪匹配。我做错了什么?
【问题讨论】:
-
至于贪婪:那个正则表达式仍然会匹配 第一个
:,然后是直到foo。在这种情况下,非贪婪仅意味着它不会匹配途中的任何foos。您可能希望将(.*?)更改为[^:]*以明确不包含任何冒号(不确定捕获组的用途)。 -
...此外,如果
foo条目是第一个或最后一个(前后没有冒号),则该正则表达式将不起作用。在任一侧只使用[^:]*应该可以解决这个问题。