usted tiene varios problemas:
- está usando el
\b
incorrectamente
- Usted está reemplazando código con variables de shell
- Es necesario citar metacaracteres
De perldoc perlre
Un límite de palabra ("\ b") es un punto entre dos caracteres que tiene una "\ w" en un lado de ella
Ninguno de los personajes @
o &
son \w
caracteres. Por lo tanto, se garantiza que su partido fallará. Es posible que desee usar algo como s/(^|\s)\@d\&(\s|$)/${1}new text$2/
(^|\s)
dice para igualar o bien el inicio de la cadena (^
) o un carácter de espacio en blanco (\s
).
(\s|$)
dice que coincida con el final de la cadena ($
) o un carácter de espacio en blanco (\s
).
Para resolver el segundo problema, debe usar %ENV
.
Para resolver el tercer problema, debe usar las secuencias de escape \Q
and \E
para escapar del valor en $ENV{a}
.
Poniendo todo junto obtenemos:
#!/bin/bash
export a='@d&'
export b='new text'
echo 'param5 @d&' |
perl -pe 'next if /^#/; s/(^|\s)\Q$ENV{a}\E(\s|$)/$1$ENV{b}$2/ if /param5/'
que imprime
param5 new text
http://stackoverflow.com/questions/576435/how-do-i-handle-special-characters- in-a-perl-regex – daxim