【问题标题】:Regex substitute multiple lines for a single line正则表达式用多行替换单行
【发布时间】:2019-04-16 13:52:58
【问题描述】:

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

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

但它使文本保持不变。

【问题讨论】:

  • 好问题。糟糕的反对票。

标签: regex perl sed


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-08-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多