O problema é o \w
. Eu só descobri isso ao tentar descobrir o que está acontecendo aqui, mas aparentemente, coisas como \s
ou \w
que já são classes de caracteres não podem ser usadas dentro de outras classes de caracteres com ERE (podem com PCREs). Para ilustrar:
$ echo foo- | sed -r 's/[\w-]+/bar/'
foobar
$ echo 'w\-foo' | sed -r 's/[\w-]+/bar/'
barfoo
$ echo foo- | sed -r 's/\w+/bar/'
bar-
Assim, as classes de escape de caracteres são tratadas como caracteres literais quando dentro de uma classe de caracteres [ ]
. A expressão [\w-]
significa "corresponde a qualquer um dos \
, w
ou -
.
Para fazer sua expressão regular funcionar, use [a-zA-z_]
em vez de \w
ou use parênteses de agrupamento:
$ echo 'mysql_query($query)' |
sed -r 's/mysql_query\(\$(\w|-)+\)/WhatIWant/'
WhatIWant
Especificamente para o seu exemplo:
$ echo 'mysql_query($query)' |
sed -r 's/(mysql_query)\((\$[a-zA-Z_-]+)\)/($link,)/'
mysql_query($link,$query)