正则表达式用多行代替一行

时间:2018-11-13 16:55:52

标签: regex perl sed

我有一个纯文本文件,其中需要用单个替换行替换多个连续的文本行。例如,当我有一个日期和时间,然后是一个空白行,然后是一个页码,

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 :(得分:2)

sed和Perl都逐行处理输入。您可以使用-0777(如果不是太大)来告诉Perl将整个文件加载到内存中:

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///,所以我不必在日期部分反斜杠。

答案 1 :(得分:0)

另一个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

$