1

I would like to run this regular expression https://regex101.com/r/9LJAjZ/1 using sed or perl to replace the contents of a file.

If I am correct this will never work with sed because sed is always greedy. But how can I make this regex work with perl.

This is what I've got so far:

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

example input file:

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

example output

url(\'/prefix/font-awesome.woff\') url(\'/prefix/bont-awesome.woff\') url(\'/favicon.ico\') url(\'data:whatever\')
2
  • Possible duplicate of Conditional replacement using sed? Commented Oct 15, 2019 at 10:15
  • Greedyness is not a problem if you take care to exclude the closing ), for example: sed -E "s#url\(\\\'(\[^/][^):]*\))#url\(\\\'/prefix/\1#g" Commented Oct 15, 2019 at 10:26

1 Answer 1

1

Modifying your command a bit:

$ 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\')

The regex, which I put in single quotes as the benefit of using \' and \" is outweighed by all the additional escaping needed, is:

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

.*? is lazy, and in the replacement, groups are referred to using $1, $2, etc. (unlike in the pattern, where it's \1, \2, etc.).

2
  • Thank you. This works. But I would need it to work with double quotes as I am in a docker container. the "prefix" text is a variable which should be replaced. perl -pi.bak -e 's#(url()(\['\''"])((?!data:|/).*?\2))#$1$2/${project}-fe/$3#g' file.js Commented Oct 15, 2019 at 11:32
  • Found it. What a horrible piece of code ... :) perl -pi.bak -e "s#(url\()(\\\[\\'\\\"])((?!data:|\\/).*?\\2\))#\$1\$2/${project}-fe/\$3#g" file.js Commented Oct 15, 2019 at 11:48

You must log in to answer this question.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.