【问题标题】:Remove all lines before pattern matching using sed (No remove the pattern line) [closed]在使用 sed 进行模式匹配之前删除所有行(不删除模式行)[关闭]
【发布时间】:2022-01-07 16:45:47
【问题描述】:

我想删除从开始到第一个模式匹配的行。(但模式行除外)

原始.txt

11

22
33

44

55

TEST line

66
77

TEST line2

expected.txt

TEST line

66
77

TEST line2

我正在使用 Ubuntu。 如何使用 sed 做到这一点?

【问题讨论】:

    标签: sed


    【解决方案1】:

    这是一种解决方案:

    sed -n '/TEST line/,/TEST line2/p' original.txt > expected.txt
    
    cat expected.txt
    TEST line
    
    66
    77
    
    TEST line2
    

    另一个可能的选择是删除第一个模式之前的所有内容和第二个模式之后的所有内容(-z 选项需要 GNU sed),例如

    sed -z 's/.*\(TEST line\n\)/\1/;s/\(TEST line2\n\).*/\1/g' original.txt > expected.txt
    
    cat expected.txt
    TEST line
    
    66
    77
    
    TEST line2
    

    您也可以将 AWK 用于此类任务,例如

    awk '/TEST line/,/TEST line2/' original.txt > expected.txt
    
    cat expected.txt
    TEST line
    
    66
    77
    
    TEST line2
    

    或grep:

    grep -A 10000 "TEST line" original.txt | grep -B 10000 "TEST line2" > expected.txt
    
    cat expected.txt
    TEST line
    
    66
    77
    
    TEST line2
    

    如果您在问题中包含更多信息,例如您自己解决问题的尝试,则更容易提供最合适的答案。

    【讨论】:

      【解决方案2】:

      删除在/pattern/ 的第一次出现和最后一行(包括)之间不是的所有内容。

      sed '/^TEST line$/,$!d'
      

      当整行与字符串完全匹配时,您也可以使用此 awk 开始打印(并继续打印):

      awk '$0 == "TEST line" {p=1} p'
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多