Perl正则表达式替换:替换特定字符串,如果另一个特定字符串不在同一行上

时间:2014-04-11 13:00:42

标签: regex perl regex-negation substitution

我有这样的文字:

Hi
... OK ... Replace ...
... BAD ... Replace ...
Hi

我想替换所有"替换"字符串"完成"当且仅当"坏"不在同一条线上的任何地方。因此,应该修改的唯一一行是我给出的示例中的第二行。我努力做到这一点,我尝试了以下不起作用:

perl -i'' -pe 's/^(?!BAD)Replace/$1Done/g' TEST

这可以用我试图做的单个表达式来完成吗?

3 个答案:

答案 0 :(得分:6)

你试图在一个正则表达式中做太多。这更直接,更容易正确

perl -pe "s/Replace/Done/ unless /BAD/" mydata

<强>输出

Hi
... OK ... Done ...
... BAD ... Replace ...
Hi

答案 1 :(得分:2)

如果该行只有一个Replace,您可以使用

之类的内容
s/^(?!.*BAD.*Replace)(.*)Replace/$1Done/

预测为否定将检查此行BAD之前是否有Replace。如果是,请将Replace替换为Done

答案 2 :(得分:1)

如果这是您的意思,您可以使用sed执行此操作:

sed -i -e '/BAD/!s/Replace/Done/' TEST