【问题标题】:Ignore linebreaks when searching for patterns with bash使用 bash 搜索模式时忽略换行符
【发布时间】:2021-11-27 21:42:12
【问题描述】:

我的文件中包含恒定的字母流,每行最多 10 个字母,如下所示:

ABCDEFGHIJ
XXXXXXXXXX
XXXXXXXXXX
XXXXXXXXXX
XXXXABCDEF
ABCDEFGHIJ

我想删除三个一组的 X,所以我希望结果是

ABCDEFGHIJ
XABCDEF
ABCDEFGHIJ

我目前的做法是

sed 's/XXX//g' inputFile > outputFile

但这仅考虑单行内的模式,并导致:

ABCDEFGHIJ
X
X
X
XABCDEF
ABCDEFGHIJ

我需要如何制定搜索模式以忽略换行符,以便从本质上接受 XXX、X\nXX 和 XX\nX?这可以通过 sed 或其他命令实现吗?

【问题讨论】:

  • 假设一行 ABCDEFGHXX 后跟 XABCDEFGHI。应该输出包含内容ABCDEFGHABCDEFGHI 的单行还是两行; ABCDEFGH 后跟 ABCDEFGHI ?

标签: bash sed line-breaks


【解决方案1】:

使用 GNU sed。修改你的正则表达式。

sed -zE 's/X\n{0,1}X\n{0,1}X\n{0,1}//g' inputFile > outputFile

或更短:

sed -zE 's/(X\n?){3}//g' inputFile > outputFile

输出到outputFile:

ABCDEFGHIJ XABCDEF ABCDEFGHIJ

-z: 用 NUL 字符分隔行

【讨论】:

    【解决方案2】:

    这样就可以了:

    paste -sd '' your_file | sed 's/XXX/   /g' | fold -w 10 | sed 's/ //g; /^$/d'
    
    • paste -sd '' your_file 将所有行合并为一行
    • sed 's/XXX/ /g' 将三个 X 替换为三个空格(注意这将是 如果原始文件有空格,则有问题,因为在最后一步中我删除了 它们全部...如果这是 案例)。
    • fold -w 10 将长行折叠回一组 10 个字符长的行
    • sed 's/ //g; /^$/d' 删除空格并删除任何空行(如果 您在第二步中使用了其他一些独特的替换而不是空格, 在此步骤中删除 that 而不是空格)。

    输出

    ABCDEFGHIJ
    XABCDEF
    ABCDEFGHIJ
    

    【讨论】:

    • 我想知道如果文件中有大量行,创建一个长行是否会导致问题,所以我用一个包含 1000 万行 (105Mb) 的文件尝试了这个答案,它花了才9秒多就正常完成了(所以我猜很多行都没有太大问题)。
    • 这样做的另一个问题是,一旦您删除所有换行符,结果就不再是每个 POSIX 的有效文本文件,因此 YMMV 与任何文本处理工具都可以处理它。跨度>
    【解决方案3】:

    这可能对你有用(GNU sed):

    sed -zE 's/(X|X\n){3}//g' file
    

    或者没有-z slurp 选项:

    sed -E 'H;$!d;x;s/^\n|(X|X\n){3}//g' file 
    

    【讨论】:

      猜你喜欢
      • 2010-11-24
      • 2011-07-07
      • 1970-01-01
      • 2023-03-24
      • 2011-08-16
      • 2012-07-14
      • 1970-01-01
      • 1970-01-01
      • 2019-03-31
      相关资源
      最近更新 更多