2010-05-27 5 views

ответ

0

На несвязанной ноте, вам может потребоваться добавить \Q and \E управляющие последовательности вокруг $a в своем регулярном выражении:

perl -pe "s/\b\Q$a\E\b/$b/g if m/param1 /" test 

Они экранировать любые символы, которые являются особенными для регулярных выражений. Если вы намерены использовать $a, чтобы удерживать регулярное выражение, вы должны перенести в него словарные ограничения (\b).

Независимо от того, что вы решите сделать, вам нужно быть осторожным со значениями в $a и $b. Например:

a="/" 
b="slash" 
perl -pe "s/\b\Q$a\E\b/$b/g if m/param1 /" test 

приведет к синтаксической ошибке. Одно из решений этого - не использовать переменные среды для замены кода. Perl позволяет получить доступ к среде через %ENV хэш:

perl -pe 's/\b\Q$ENV{a}\E\b/$ENV{b}/g if m/param1 /' test 

Обратите внимание на использование отдельных клещей, чтобы избежать лечения $ENV в качестве переменной оболочки.

3

Maybe

perl -pe "s/\b$a\b/$b/g if m/param1/ && ! /^#/" test 

.

2

unless такое же, как if not. Судя по тому, как вы написали заявление, я предполагаю, что вы имеете в виду следующее:

perl -pe "s/\b$a\b/$b/g if m/param1/ and not /^#/" test 

(Хотя, возможно, имел в виду or вместо and?)

+0

Также обратите внимание, что лучше использовать && вместо 'и'. 'и' имеет гораздо более низкий приоритет, чем && –

Смежные вопросы