Регулярное выражение Perl для рекурсивной замены строки в нескольких файловых группах, например "* .php" "* .html" - PullRequest
0 голосов
/ 27 сентября 2018

Следующая команда не работает, ничего не делает:

sudo find /srv/my/directory -type f -iname '*.htm*' -iname '*.old1' -iname '*.php' | sudo xargs -iX sudo perl -p -i -e 's|\<\?php.*123456.*123456.*\?\>\r?\n\<\?php|<?php|g' 'X'

Она ничего не заменяет в файлах.

Что не так?

РЕШЕНИЕ:

sudo find /srv/my/directory -type f -iname '*.htm*' -or -iname '*.old1' -or -iname '*.php' | sudo xargs -iX sudo perl -0777 -p -i -e 's|\<\?php.*123456.*123456.*\?\>\r?\n\<\?php|<?php|g' 'X'

РЕШЕНИЕ 2 (расширяет возможности для нескольких ситуаций в регулярном выражении):

sudo find /srv/my/directory -type f -iname '*.htm*' -or -iname '*.old1' -or -iname '*.php' | sudo xargs -iX sudo perl -0777 -p -i -e 's@\<\?php.*123456.*123456.*\?\>(\r?\n|\#\!.*)\<\?php@<?php@gs' 'X'

1 Ответ

0 голосов
/ 27 сентября 2018
  1. При указании нескольких условий для find они по умолчанию связаны неявным -and.Ни один файл не может соответствовать -iname '*.old1' -and -iname '*.php'.Вы должны явно указать -or.

  2. Если не указано иное, perl -p читает файл построчно, поэтому он не может совпадать с \n<.Используйте -0777, чтобы прочитать весь файл, а не обрабатывать его построчно.

sudo find /srv/my/directory -type f \
    -iname '*.htm*' -or -iname '*.old1' -or -iname '*.php' \
    | sudo xargs -iX sudo perl -0777 -p -i \
        -e 's/<\?php.*123456.*123456.*\?>\r?\n<\?php/<?php/g' 'X'

Кстати, вам не нужно ставить обратную косую черту <и > в регулярных выражениях Perl.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...