【问题标题】:Deleting everything in a single column after a certain pattern在特定模式后删除单列中的所有内容
【发布时间】:2016-12-08 06:27:37
【问题描述】:

我有以下几行

ABC-Dup2  XUAS  BSNMM
CVD  nbvn  nbmsb
SVDB-Dup4  NBV  KJHA
TTS-Dup7  MNMN  NBA

我只想从第一列中删除 -Dup 并保留其余列,以便我拥有

ABC  XUAS  BSNMM
CVD  nbvn  nbmsb
SVDB  NBV  KJHA
TTS  MNMN  NBA

我正在尝试 sed 's/-Dup.*//1' 但它也从该行中删除了其余列。

【问题讨论】:

    标签: shell awk replace sed


    【解决方案1】:

    sed 解决方案需要合并字段分隔符以将目标定义为仅第一列。 GNUsed:

    $ sed -r 's/^(\S*)-Dup\S*/\1/' file
    
    ABC  XUAS  BSNMM
    CVD  nbvn  nbmsb
    SVDB  NBV  KJHA
    TTS  MNMN  NBA
    

    【讨论】:

      【解决方案2】:
      sed 's/\(^[^ ]*\)-Dup[0-9]*/\1/' 
      

      【讨论】:

        【解决方案3】:

        如果您将 .* 更改为 [^[:blank:]]*,您将不再遇到该问题,但您仍然会遇到 sed 从 anywhere 中删除 -Dup 的问题,而不仅仅是第一列。只需使用 awk:

        awk '{sub(/-Dup.*/,"",$1)}1' file
        

        注意 only 如何作用于第一列(字段):

        $ cat file
        ABC-Dup2  XUAS  BSNMM
        CVD  nbvn-Dup7  nbmsb
        SVDB-Dup4  NBV  KJHA
        TTS-Dup7  MNMN  NBA
        
        $ awk '{sub(/-Dup.*/,"",$1)}1' file
        ABC XUAS BSNMM
        CVD  nbvn-Dup7  nbmsb
        SVDB NBV KJHA
        TTS MNMN NBA
        

        【讨论】:

          【解决方案4】:

          如果模式是 -Dup 后跟一个数字,那么您可以尝试类似

          sed 's/-Dup[0-9]*//1'

          【讨论】:

          • 试一下,如果输入的第二行是CVD nbvn-Dup7 nbmsb。末尾的1 是第一次出现的正则表达式,它不是字段编号。
          • 我知道,来自 OP 的测试样本没有提到 -Dup 模式可能在第一列以外的任何地方
          • 不,但他确实用漂亮的大写字母说FIRST COLUMN ONLY,所以恕我直言,这是一个非常强烈的暗示。 1 是多余的,顺便说一句,这是默认行为。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-06-27
          • 2019-06-28
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多