Проблема с многострочным сопоставлением perl

Лучшая практика, как другие сказали, должна поместить каждый класс в свою собственную единицу перевода от обслуживания кода и перспективы понятности. Однако в крупномасштабных системах это иногда не желательно - видят, что раздел, наделенный правом ", Делает Те Исходные файлы Больше" в эта статья Bruce Dawson для обсуждения компромиссов.

21
задан faman 2 May 2011 в 21:04
поделиться

2 ответа

perl -p обрабатывает файл по одной строке за раз. У вас есть правильное регулярное выражение, но оно никогда не сопоставляется с многострочной строкой.

Простая стратегия, предполагая, что файл помещается в памяти, состоит в том, чтобы прочитать все целиком (сделайте это без -p):

$/ = undef;
$file = <>;
$file =~ s/START\s+STOP/REPLACE/sg;
print $file;

Обратите внимание, я добавил модификатор /g к указать глобальную замену.

В качестве ярлыка для всего этого дополнительного шаблона вы можете использовать существующий скрипт с опцией -0777 : perl -0777pi -e 's/START\s+STOP/REPLACE/sg'. Добавление /g все еще необходимо, если вам может потребоваться сделать несколько замен в файле.

Икота, с которой вы можете столкнуться, хотя и не с этим регулярным выражением: если регулярное выражение было START.+STOP, а файл содержит несколько пар START / STOP, жадное сопоставление .+ сожрет все от первого START до Последняя остановка. Вы можете использовать не жадное сопоставление (сопоставлять как можно меньше) с .+?.

Если вы хотите использовать якоря ^ и $ для границ строк в любом месте строки, вам также понадобится модификатор /m regex.

23
ответ дан 29 November 2019 в 06:51
поделиться
perl -MFile::Slurp -e '$content = read_file(shift); $content =~ s/START\s+STOP/REPLACE/s; print $content' input.txt
2
ответ дан 29 November 2019 в 06:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: