使用 sed 或 PERL 替换文件中的内容

使用 sed 或 PERL 替换文件中的内容

我想运行这个正则表达式https://regex101.com/r/9LJAjZ/1使用 sed 或 perl 替换文件的内容。

如果我是正确的,这将永远不会与 sed 一起工作,因为 sed 总是贪婪的。但是我怎样才能让这个正则表达式与 perl 一起工作呢?

这是我到目前为止所得到的:

perl -pi.bak -e "s#url\(\\[\'|\"]((?!data:|\/).*)\\[\'|\"]\)#url\(\\\'/prefix/\1\\\'\)/#g" file.js

输入文件示例:

url(\'font-awesome.woff\') url(\'bont-awesome.woff\') url(\'/favicon.ico\') url(\'data:whatever\')

示例输出

url(\'/prefix/font-awesome.woff\') url(\'/prefix/bont-awesome.woff\') url(\'/favicon.ico\') url(\'data:whatever\')

答案1

稍微修改一下你的命令:

$ perl -pe 's#(url\()(\\['\''"])((?!data:|/).*?\2\))#$1$2/prefix/$3#g' foo
url(\'/prefix/font-awesome.woff\') url(\'/prefix/bont-awesome.woff\') url(\'/favicon.ico\') url(\'data:whatever\')

正则表达式(我将其放在单引号中作为使用的好处\'\"是:

s#(url\()(\\['"])((?!data:|/).*?\2\))#$1$2/prefix/$3#g
   _____  ______  __________________ 
    $1     $2 \2         $3
    url(   \'         ...\')
           \"         ...\")

.*?是惰性的,并且在替换中,使用$1$2等引用组(与模式中的 、 等不同\1\2

相关内容