【问题标题】:awk/sed: Delete rest of line after second matchawk/sed:第二次匹配后删除剩余的行
【发布时间】:2012-08-29 17:42:07
【问题描述】:

我需要一些帮助来删除某些文件中第 1 行(并且只有第 1 行)的第二次匹配之后(包括)该行的其余部分。例如,如果模式是星号 *:

输入:

asd*asd*asd*asd*asd*
asdasdasd*asdasdasd*asdasdasd*asdasdasd

预期输出:

asd*asd
asdasdasd*asdasdasd*asdasdasd*asdasdasd

谢谢!

【问题讨论】:

    标签: sed awk


    【解决方案1】:

    一个awk解决方案:

    awk '
        BEGIN { FS = OFS = "*" } 
        FNR == 1 { 
            print $1, $2 
        } 
        FNR > 1 { 
            print 
        }
    ' infile
    

    产生:

    asd*asd
    asdasdasd*asdasdasd*asdasdasd*asdasdasd
    

    【讨论】:

      【解决方案2】:

      要将操作限制在一行,请使用“地址”:

      sed '1s/\([^*]\*[^*]*\).*/\1/'
      

      【讨论】:

      • 谢谢!效果很好。我只是担心我的例子不能很好地代表我的数据。如果我想让模式成为一个选项卡怎么办?不知何故,当我用 \t 替换方括号内的星号时,它不起作用... sed '1s/([^\t]*[^\t]*).*/\1/'
      • sed 无法表示选项卡。您可以使用 bash 的引用来帮助它:sed $'1s/\([^\t]\t[^\t]*\).*/\\1/'
      【解决方案3】:

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

      sed '1s/\*[^*]*//2g' file
      

      【讨论】:

      • 注意:使用 2g 会产生未指定的行为,因此不要依赖于其他 sed 实现。
      • 注: @WilliamPursell 我确实指定了 GNU sed。
      最近更新 更多