Регулярное совпадение нескольких строк в подпапках (одна строка) - PullRequest
1 голос
/ 12 июля 2011

В настоящее время я использую следующий Perl one liner для рекурсивного сопоставления нескольких строк в файлах среди подпапок.Это работает за исключением того, что оно заставляет вас использовать ., чтобы соответствовать \n.Но мне нужно использовать \n, потому что . также будет соответствовать любому символу.

Есть ли способ сделать это с Perlлайнер?Как насчет одной линии с другими программами Linux?

perl -i -pe 'BEGIN{undef $/;} s/FIND/REPLACE/smg' $(find "/PATH-TO-DIRECTORY" -name "*.html" -type f)

РЕДАКТИРОВАТЬ:

Регулярное выражение: \ thello world! ....

Регулярное выражение: \ thello world! \ N \ n \ n \ n

Пример теста:


    hello world!


    hello world!
    foo

1 Ответ

1 голос
/ 12 июля 2011

Я создал дерево каталогов и файлов, что приведет к следующей ситуации:

$ cat $(find a -type f)
EFabcd
EFbacA
QuuxQuuxr
Foobar
abcd

Затем, используя sed, я думаю, что я нашел решение для того, что вы ищете:

$ sed -n 'H;${x;s/d\nEF/FOO/;p;}' $(find a -type f)

Как это работает? Сначала мы подавляем вывод sed с помощью -n. Затем приходит команда. Для каждой строки мы добавляем новую строку и ее содержимое в область удержания:

H

В конце файла он переносит содержимое пространства удержания в пространство шаблона (где можно выполнить замену):

x

После этого у нас все содержимое всех файлов рассматривается как единственная строка. Теперь мы можем заменить шаблон, который также включает новую строку, например:

s/d\nEF/FOO/

После замены мы печатаем результат:

p

Результат:

$ sed -n 'H;${x;s/d\nEF/FOO/g;p;}' $(find a -type f)

EFabcFOObacA
QuuxQuuxr
Foobar
abcd

(Обратите внимание, что в начале результата есть пустая строка. Я считаю, что ее также легко исправить).

Что-то вроде этого вы ищете?

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