Regex заменить несколько строк для одной строки - PullRequest
0 голосов
/ 13 ноября 2018

У меня есть простой текстовый файл, в котором мне нужно заменить несколько последовательных строк текста одной строкой замены.Например, когда у меня есть дата и время, за которыми следует пустая строка, за которой следует номер страницы,

11/13/2018 08:33:00

Page 1 of 1

я бы хотел заменить ее одной строкой (например, PAGE BREAK).

Я пробовал

sed 's/\d{2}\/\d{2}\/\d{4} \d{2}:\d{2}:\d{2}\n\nPage \d of \d/PAGE BREAK/g' file1.txt > file2.txt

и

perl -pe 's/\d{2}\/\d{2}\/\d{4} \d{2}:\d{2}:\d{2}\n\nPage \d of \d/PAGE BREAK/g' file1.txt > file2.txt

, но текст остается без изменений.

Ответы [ 2 ]

0 голосов
/ 14 ноября 2018

Другой вариант Perl

$ cat page_break.txt
123 45 jh kljl
11/13/2018 08:33:00

Page 1 of 1
ghjgjh hkjhj
fhfghfghfh
11/13/2018 08:33:00

Page 1 of 2
ghgigkjkj

$ perl -ne '{ if ( (/\d{2}\/\d{2}\/\d{4} \d{2}:\d{2}:\d{2}/ and $x++)or ( /^\s*$/ and $x++) or (/Page \d of \d/ and $x++) ){} if($x==0) { print "$_" } if($x==3) { print "PAGE BREAK\n"; $x=0} }' page_break.txt
123 45 jh kljl
PAGE BREAK
ghjgjh hkjhj
fhfghfghfh
PAGE BREAK
ghgigkjkj

$
0 голосов
/ 13 ноября 2018

И sed, и Perl обрабатывают ввод построчно. Вы можете указать Perl загрузить весь файл в память, используя -0777 (если он не слишком большой):

perl -0777 -pe 's=[0-9]{2}/[0-9]{2}/[0-9]{4} [0-9]{2}:[0-9]{2}:[0-9]{2}\n\nPage [0-9]+ of [0-9]+=PAGE BREAK=g'

Обратите внимание, что я использовал [0-9], потому что \d может соответствовать ٤, ໖, ६ или ?.

Я также использовал s=== вместо s///, поэтому мне не нужно выполнять обратную косую черту в части даты.

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