Perl регулярное выражение: удалить все (включая разрывы строк), пока не будет найдено соответствие - PullRequest
2 голосов
/ 08 июня 2011

Извиняюсь за простой вопрос. Я не чищу текст или часто использую регулярные выражения.

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

perl -p -i -e "s/.*By.unanimous.vote//g" *.txt

Но это не работает.

Спасибо

Ответы [ 5 ]

4 голосов
/ 08 июня 2011

Решение с использованием оператора триггер :

perl -pi -e '$_="" unless /By.unanimous.vote/ .. 1' input-files

Более короткое решение, в котором также используется псевдооператор x=!! :

per -pi -e '$_ x=!! (/By.unanimous.vote/ .. 1)' input-files
3 голосов
/ 08 июня 2011

Попробуйте с:

Если хочешь избавиться до последнего By.unanimous.vote

perl -00 -pe "s/.*By.unanimous.vote//s" inputfile > outputfile

Если хочешь избавиться до первого By.unanimous.vote

perl -00 -pe "s/.*?By.unanimous.vote//s" inputfile > outputfile
1 голос
/ 08 июня 2011

Попробуйте что-то вроде:

perl -pi -e "$a=1 if !$a && /By\.unanimous\.vote/i; s/.*//s if !$a" *.txt

Следует удалить строки перед совпавшей линией. Если вы хотите удалить совпадающую строку, вы можете сделать что-то вроде:

perl -pi -e "$a=1 if !$a && s/.*By\.unanimous\.vote.*//is; s/.*//s if !$a" *.txt

Укороченные версии:

perl -pi -e "$a++if/By\.unanimous\.vote/i;$a||s/.*//s" *.txt
perl -pi -e "$a++if s/.*By\.unanimous\.vote.*//si;$a||s/.*//s" *.txt
0 голосов
/ 08 июня 2011

Решение с использованием awk

awk '/.*By.unanimous.vote/{a=1} a==1{print}' input > output
0 голосов
/ 08 июня 2011

Вы еще не сказали, хотите ли вы сохранить часть By.unanimous.vote, но для меня это звучит так, как вы хотите:

s/[\s\S]*?(?=By\.unanimous\.vote)//

Обратите внимание на отсутствующий флаг g и ленивый *?квантификатор, потому что вы хотите остановить сопоставление, как только вы нажмете эту строку.Это должно сохранить By.unanimous.vote и все после него.[\s\S] соответствует символам новой строки.В Perl вы также можете сделать это с помощью:

s/.*?(?=By\.unanimous\.vote)//s
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...