2013-12-01 2 views
3

Я пытаюсь манипулировать многострочными комментариями CoffeeScript в файле с использованием perl. Это мое регулярное выражение:perl regex работает в скрипте, но не при выполнении в командной строке

^\t*###[\S\s]*?^\t*### 

Когда я запускаю это в сценарии, где данные данные файла, он делает то, что я ожидаю, и заменяет все многострочные комментарии с «Foo»:

$data =~ s{^\t*###[\S\s]*?^\t*###}{"foo"}gme; 

Однако, когда я запускаю это в командной строке файл неизменен:

perl -pi -e 's{^\t*###[\S\s]*?^\t*###}{"foo"}gme' file.coffee 

Я использовал подобные команды с различными регулярными выражениями и без опции «т» и все они работают. Это вопрос m, вызывающий проблему? Я уверен, что это что-то простое.

+0

Мне любопытно, если файловая система берет '\ t' как литовую вкладку вместо фактической вкладки регулярных выражений? Что произойдет, если вы попытаетесь избежать обратных косых черт? – brandonscript

+0

Побег с обратной косой чертой как '\\ t'? –

+0

Да, дайте это выстрел. Не знаю, будет ли это работать :) – brandonscript

ответ

4

В неявных петлях, установленных -n и -p это может быть полезно для определения значений $/ и $\. Использование опции -0 ставит Perl в режиме абзаца, а специальное значение 0777 ставит Perl в режим файлового slurp.

perl -0777 -i -pe 's{^\t*###[\S\s]*?^\t*###}{"foo"}gme' file.coffee 
+0

Спасибо за то, что вы ответили за каждого, кто наткнулся на этот вопрос. –

3

Perl-документация для -n/-p опционных состояний:

assume "while (<>) { ... }" loop around program 

Это означает, что каждый раз, когда выражение -e выполняется, $_ это одна строка входного файла. Ваше выражение s/// ожидает, что он будет работать со всем целым файлом сразу, поэтому он не будет работать в этом режиме.

+0

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

+0

Не на месте, которое я могу найти, но вы, вероятно, могли бы сделать что-то вроде: 'perl -e 'local $ /; $ data = <>; $ data = ~ s/find/replace /; print $ data '< file > file.new && mv file.new file' –

+0

Nice. Спасибо за помощь. –

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