2016-09-21 2 views
1

У меня есть PERL Однострочник, который работает, когда заявление журнала находится на одной линии:Закомментируйте заявление журнала многострочного Использования Perl один лайнер регулярки замены

find -type f -iname "*java" | xargs -d'\n' -n 1 perl -i -pe 's{(log.*((info)|(debug)).*)}{//$1}gi' 

Но пытаться изменить это работать на нескольких линий является сложно. Я знаю, что модификатор s будет соответствовать новым строкам, но как мне его получить, чтобы прокомментировать последующие строки (т. Е. До ;, если в строке журнала его нет)?

У меня все в порядке с решением, которое делает многострочные операторы журнала в однострочные операторы журнала. Я также соглашусь с комментариями в стиле C (хотя было бы неплохо найти решение для комментариев стиля C++).

(Не говорите мне, чтобы отключить ведение журнала регистрации. Тот, кто на самом деле пытался, что поймет, как жестоко осложняется тем, что в нетривиальных приложениях.)

ответ

1

Просто общая идея (пожалуйста, адаптируются к вашему делу .. .)

...perl -i -p0e 's{(log.*?((info)|(debug)).*?;)}{ $1 =~ s!^|\n!\n//!gr }gsei' 

где:

  • .*? вместо .* вести себя, не GReddy
  • -p0e обрабатывать полный текст в качестве одной записи
  • $1 =~ s!^|\n!\n//!gr сделать дополнительную обработку внутренних переводов строк

Пожалуйста, проверьте его перед нанесением ...

+0

О, 2 и 3 являются новыми для меня и выглядят очень полезными. Я буду следить, если это не удовлетворит мои потребности. –

+1

Хмммм, он комментирует множество строк импорта. Мне нужно немного поближе рассмотреть его, чтобы отладить его. –

+1

, если вы представите пример с некоторыми проблемными случаями, я могу попытаться дать альтернативы ... – JJoao

1

Вы можете использовать range operator, start .. stop:

perl -i -pe 's!^!//! if /log.*(info|debug)/ .. /;/' 
Смежные вопросы