如何在应用于字符串的替换函数中使用RegEx来匹配子字符串的所有实例(第一个除外)?
e.g。如果我要替换除第一个之外的所有'a'而且我的字符串是:
a b a c b a a b
我想得到:
a b c b b
我的实际用例是我正在使用Ant构建一个项目,它将一堆.js文件连接成一个。每个javascript文件都以:“use strict”开头。我只想要一次这个声明,因此我希望删除这个子字符串的所有实例,除了开头的那个。
答案 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";
的所有匹配项,然后再次添加一个。
修改:示例:
sed '/"use strict";/d' < infile > outfile
变为
(echo '"use strict"'; sed '/"use strict";/d') < infile > outfile
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