我有一个纯文本文件,其中需要用单个替换行替换多个连续的文本行。例如,当我有一个日期和时间,然后是一个空白行,然后是一个页码,
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
但是它使文本保持不变。
答案 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
$