【发布时间】:2019-09-23 08:19:41
【问题描述】:
因为这个问题可能会产生误导,所以这里举个小例子。我有这种文件:
some text
some text @@some-text-KEY-some-other-text@@
text again @@some-text-KEY-some-other-text@@ @@some-text-KEY-some-other-text@@
again @@some-text-KEY-some-other-text-KEY-text@@
some text with KEY @@KEY-some-text@@
blabla @@KEY@@
在此示例中,我想将一对 @@ 中出现的每个 KEY- 替换为 VALUE-。我从这个 sed 命令开始:
sed -i 's/\(@@[^@]*\)KEY-\([^@]*@@\)/\1VALUE-\2/g'
这是它的工作原理:
-
\(@@[^@]*\):创建由两个@和除@之外的任何字符组成的第一组... -
KEY-: ...直到该行最后一次出现KEY- -
\([^@]*@@\):并创建第二组,其中包含除@之外的所有字符,直到下一对@。
问题是我的命令无法正确处理以下行,因为我的一对 @@ 中有多个 KEY-:
again @@some-text-KEY-some-other-text-KEY-text@@
确实,我得到了这个结果:
again @@some-text-KEY-some-other-text-VALUE-text@@
如果我想替换该行中所有出现的KEY-,我必须多次运行我的命令,我宁愿避免这种情况。我也尝试过使用惰性运算符,但问题是一样的。
如何创建可以正确处理我所有文件的正则表达式和 sed 命令?
【问题讨论】: