RegEx - 替换除第一场比赛之外的所有比赛

时间:2012-09-16 23:08:55

标签: regex

如何在应用于字符串的替换函数中使用RegEx来匹配子字符串的所有实例(第一个除外)?

e.g。如果我要替换除第一个之外的所有'a'而且我的字符串是:

a b a c b a a b

我想得到:

a b c b b

我的实际用例是我正在使用Ant构建一个项目,它将一堆.js文件连接成一个。每个javascript文件都以:“use strict”开头。我只想要一次这个声明,因此我希望删除这个子字符串的所有实例,除了开头的那个。

3 个答案:

答案 0 :(得分:1)

这是一般的正则表达式:

echo "a b a c b a a b" | perl -pWe 's/(?<=(a))(.*?)\1/$2/g'

它使用lookbehind来检查匹配的模式是否在字符串中的第一个。 (基本上,我的想法是s/(?<=(a).*?)\1//g,但可变长度的后视似乎并没有得到广泛实施。 有一个缺点 - 它会产生类似

的输出
a b  c b   b

为了使其整洁,您可以使用

echo "a b a c b a a b" | perl -pWe 's/(?<=(a\s))(.*?)\1/$2/g'

但它不会删除a

等输入中的上一个a b a c b a a

答案 1 :(得分:0)

只需删除"use strict";的所有匹配项,然后再次添加一个。

修改:示例:

  1. sed '/"use strict";/d' < infile > outfile
    

    变为

    (echo '"use strict"'; sed '/"use strict";/d') < infile > outfile
    
  2. perl -nie 'print unless /"use strict";/;' file
    

    变为

    perl -nie 'BEGIN { print qq["use strict";\n]; } print unless /"use strict";/;' file
    

答案 2 :(得分:0)

要解决您的示例,您可以使用否定先行断言:

echo "a b a c b a a b" | perl -pe 's/(?!^)a //g'

结果:

a b c b b

要解决您的项目问题(假设您的连接文件中的每一行都不会多次出现use strict),您可以使用GNU sed删除除第一个以外的所有匹配项:

sed '0,/$/!s/use strict//g' file.txt