2009-02-19 4 views
3

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

т.е. превратить это:

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

в этом

.... foo(bar .... 

Я попытался следующие, но receivied это сообщение об ошибке:

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

ответ

11

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

+0

Да, не могу поверить, что я об этом не думал. Пятница не скоро придет. – dmercer

6

Gah. Из командной строки, не меньше. Путь слишком много уровней интерпретации метасимволов.

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

+0

Спасибо, ты за 8 секунд отстала от предыдущего ответа. ура – dmercer

0

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

perl -pe "s/\Q\(\E/(/g" ./file