Как избежать левого скобки в регулярном выражении Perl?

Если у меня есть файл, содержащий некоторые экранированные скобки, как я могу заменить все экземпляры неэкранированной скобкой с помощью Perl?

то есть поверните это:

.... foo\(bar ....

в это

.... foo(bar ....

Я пробовал следующее, но получил это сообщение об ошибке:

perl -pe "s/\\\(/\(/g" ./file
Unmatched ( in regex; marked by <-- HERE in m/\\( <-- HERE / at -e line 1.

person Community    schedule 19.02.2009    source источник


Ответы (3)


Вы забываете, что обратная косая черта тоже что-то значит для оболочки. Попробуйте использовать одинарные кавычки вместо двойных. (Или поместите свой сценарий в файл, где вам не нужно будет беспокоиться о кавычках оболочки.)

person Community    schedule 19.02.2009
comment
Гах, не могу поверить, что я не подумал об этом. Пятница не может прийти достаточно скоро. - person dmercer; 20.02.2009

Гах. Из командной строки, не иначе. Слишком много уровней интерпретации метасимволов.

Попробуйте заменить двойные кавычки одинарными, посмотрите, поможет ли это.

person Community    schedule 19.02.2009
comment
Спасибо, вы примерно на 8 секунд отстаете от предыдущего ответа. Ваше здоровье - person dmercer; 20.02.2009

cjm ответ, вероятно, лучший. Если вы должны сделать это в командной строке, попробуйте использовать quotemeta() или экранирующая последовательность в метакавычках (\Q...\E). Это сработало для меня в командной строке bash:

perl -pe "s/\Q\(\E/(/g" ./file
person Community    schedule 20.02.2009