【问题标题】:Replacing a string with newline character with another string用另一个字符串替换带有换行符的字符串
【发布时间】:2021-07-19 05:02:31
【问题描述】:

我有一个包含数据集的大文件,例如:

100  S|||
100  S|d1|||88|||
100  S|0d|f6||f630|589f||

我需要将||| 替换为|||||||,前提是该行仅包含一个||| 序列以外的管道。

我尝试使用 sed 命令来满足这个要求:

sed -i 's/|||/|||||||/g' input.txt

但是,它也在更改第二行中的记录,这不是有意的。

正确的命令用法是什么?任何帮助将不胜感激。

【问题讨论】:

    标签: regex unix sed


    【解决方案1】:

    您可以将此sed 命令与捕获组一起使用,以匹配||| 前后的非pi[e 字符:

    sed -E 's/^([^|]*)(\|\|\|)([^|]*)$/\1\2||||\3/' file
    
    100  S|||||||
    100  S|d1|||88|||
    100  S|0d|f6||f630|589f||
    

    详情:

    • ^:开始
    • ([^|]*): 匹配捕获组 #1 中的 0 个或多个非管道字符
    • (\|\|\|): 匹配捕获组 #2 中的 3 个管道字符
    • ([^|]*): 匹配捕获组#3 中的 0 个或多个非管道字符
    • $:结束
    • \1\2||||\3 是替换模式,它在反向引用 #2 之后插入 ||||,即 \2,同时按原样放回 \1\3

    【讨论】:

      【解决方案2】:

      使用awk,您可以尝试关注。使用 GNU awk 中的示例编写和测试。

      awk 'gsub(/\|/,"&")==3{gsub(/\|\|\|/,"&||||")} 1' Input_file
      

      说明:为上述添加详细说明。

      awk '                       ##Starting awk program from here.
      gsub(/\|/,"&")==3{          ##checking if line has only 3 ||| then do following.
        gsub(/\|\|\|/,"&||||")    ##Globally substituting ||| with itself and |||| here.
      }
      1                           ##printing current line here.
      ' Input_file                ##Mentioning Input_file name here.
      

      【讨论】:

        【解决方案3】:

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

        sed '/^[^|]*|||[^|]*$/s/|||/&&|/' file
        

        如果一行只包含 3 个连续的|,则将它们替换为 7 个|

        【讨论】:

          猜你喜欢
          • 2019-05-14
          • 2018-01-14
          • 2013-12-03
          • 2017-01-28
          • 2017-03-07
          • 1970-01-01
          • 1970-01-01
          • 2021-06-15
          相关资源
          最近更新 更多