【问题标题】:sed or awk to print lines between wordssed 或 awk 打印单词之间的行
【发布时间】:2010-08-23 15:08:42
【问题描述】:

如何打印之间的所有行 “B节(” 到下一个以行开头的“节”字?

A 部分(

。 .

)

B 部分(

。 .

)

C 部分(

。 .

)

【问题讨论】:

    标签: sed


    【解决方案1】:
    sed -n '
      /^section B/!n;
      /^section B/d;
      /^)/q;
      p
    ' yourfile
    

    上述sed脚本的解释,分步骤:

    1. 虽然! 不以section B 开头的行移动到下一行。
    2. 在我们到达所需的行之后,删除 section B 文本行。
    3. 如果该行以) 开头,我们将退出。
    4. 否则我们打印当前处理的行。

    【讨论】:

    • 不知何故 /^section B/!n; 让我打印该行之前的内容。
    【解决方案2】:

    如果您想打印从“B 部分”到“C 部分”的所有内容包括这些行,

    sed -ne '/^section B/,/^section/p'
    

    如果您不想打印两个“节”行,

    sed -e '1,/^section B/d' -e '/^section/,$d'
    

    如果您想包含“section B”和右括号(但不是“section C”),

    sed -ne '/^section B/,/^)/p'
    

    还有一些其他可能的变体。

    【讨论】:

      【解决方案3】:
      sed -n '/section B/,/)/p' file
      

      或 awk

      awk '/section B/,/)/{print}' file
      
      awk -vRS=")" '/section B/{print $0RT}' file
      

      【讨论】:

        【解决方案4】:

        一般来说,如果您想在文件中的行之间“保持状态” - 就像您在此处所做的那样 - 那么 sed 将无法完成这项工作。在这种情况下,Awk 可能是您可以使用的最简单的工具。

        以下 awk 脚本可以满足您的需求:

        /^section\ B\ \(/   {InSection=1; next;}
        /^\)/       {InSection=0; next;}
        //          {if (InSection) print $0;}
        

        【讨论】:

          最近更新 更多