Лучшая практика, как другие сказали, должна поместить каждый класс в свою собственную единицу перевода от обслуживания кода и перспективы понятности. Однако в крупномасштабных системах это иногда не желательно - видят, что раздел, наделенный правом ", Делает Те Исходные файлы Больше" в эта статья Bruce Dawson для обсуждения компромиссов.
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.
perl -MFile::Slurp -e '$content = read_file(shift); $content =~ s/START\s+STOP/REPLACE/s; print $content' input.txt