如何在一个用于字符串的替换函数中使用RegEx来匹配一个子字符串的所有实例(除了第一个实例)?
例如,如果我要替换所有'a‘,除了第一个和我的字符串是:
a b a c b a a b我想要:
a b c b b我的实际用例是,我正在使用Ant构建一个项目,它将一堆.js文件连接在一起。每个javascript文件都以“使用严格”开头。我只想要这个声明一次,因此我希望删除该子字符串的所有实例,但开头的实例除外。
发布于 2012-09-17 14:11:08
下面是一个通用正则表达式:
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 b a c b a a那样删除输入中的最后一个a b a c b a a
发布于 2012-09-16 23:37:15
只需删除所有出现的"use strict";,然后在开始时添加一个。
编辑:示例:
发布于 2012-09-16 23:41:18
要解决您的示例,可以使用负面的前瞻性断言:
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 https://stackoverflow.com/questions/12451470
复制相似问题