在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?但方案有没有帮助,因为在这里我想匹配{{
和}}
之间的一切,除了两个连续字符序列特异性,即}}
。如果我试图在分隔符之间匹配除了单个字符之外的所有内容,那么对这个问题的答案会有所帮助。