【发布时间】:2016-11-05 07:42:14
【问题描述】:
在 POSIX shell 脚本中,我需要找到所有出现在 {{ 和 }} 中的文本,并将文本以及周围的大括号替换为星号。
例如,如果输入是
{{ abc }} def {{ ghi {jkl} mno }} pqr
那么输出一定是
* def * pqr
我还没有想出一个有效的sed 命令。
我尝试了几个命令,但它们不起作用。例如,以下命令不会产生所需的输出,因为sed 会进行贪婪匹配。它最终匹配 {{ abc }} def {{ ghi {jkl} mno }} 作为第一个匹配项,而不仅仅是 {{ abc }}。
$ echo "{{ abc }} def {{ ghi {jkl} mno }} pqr" | sed 's/{{.*}}/*/g'
* pqr
这是另一个不起作用的示例,因为它最终匹配的太少。它不匹配{{ ghi {jkl} mno }}(我们想要匹配),因为这部分字符串包含}。
$ echo "{{ abc }} def {{ ghi {jkl} mno }} pqr" | sed 's/{{[^}]*}}/*/g'
* def {{ ghi {jkl} mno }} pqr
我还能怎么做这样的比赛?
我已经使用了Non greedy regex matching in sed?,但那里的解决方案没有帮助,因为在这里我想匹配{{ 和}} 之间的所有内容,除了两个连续字符的特定序列,即}}。如果我尝试匹配分隔符之间除了单个字符之外的所有内容,那么该问题的答案会有所帮助。
【问题讨论】: