Sim, você pode usar o operador quotemeta
do Perl com aspas simples:
export MATCH=...
... | perl -pe 's/(\Q$ENV{MATCH}\E)/...
Qualquer coisa entre \Q
e \E
(ou até o final da regex, se nenhum \E
for fornecido) é considerado como está, sem nenhum significado especial anexado aos metacaracteres.
Equivalente:
export MATCH=...
... | perl -pe '$sane=quotemeta $ENV{MATCH};s/($sane)/...
Atualizar
Veja como isso pode ser feito sem export
:
MATCH=/dev/
printf "aaa\n/dev/aaa\nccc\n" \
| perl -pe "\$sane=quotemeta q{$MATCH};s/(\$sane)/\e[1;31m\\e[0m/g"
Observe que seu código teve um erro. Você não pode usar uma referência anterior ( ) no padrão de substituição de um
s///
, você precisa usar a variável de correspondência ( $1
), que usei como \
aqui, para evitar o shell interpolando $1
por causa das aspas suaves.
Em geral, se você está fazendo muito trabalho de colorização com Perl, sugiro usar um módulo para lidar com idiossincrasias de terminal para você. Confira Termo :: ANSIColor por exemplo.