【问题标题】:UNIX - Sed Command to print Occurrence between linesUNIX - Sed 命令打印行之间的出现
【发布时间】:2014-05-12 18:54:08
【问题描述】:
sed '/Storage/,/Design/p' sample.txt

以上有助于打印StorageDesign 之间的行。

我的问题是如何获得上述 sed 命令的第二次出现?

我的文件有很多存储 - 设计模式匹配,但我想采用第二个出现的段落。

【问题讨论】:

    标签: unix sed


    【解决方案1】:

    这个awk 打印第二部分:

    cat file
    start
    1 data
    end
    not this
    start
    2 more data
    end
    not here
    

    awk '/start/ {f=1;a++} f && a==2; /end/ {f=0}' file
    start
    2 more data
    end
    

    如果文件中的startend 多,这算start/end

    cat file
    start
    start
    1 data
    end
    not this
    start
    2 more data
    end
    not here
    

    awk '/start/ {f=1} f && a==1; /end/ {if (f) a++;f=0}' file
    start
    2 more data
    end
    

    【讨论】:

      【解决方案2】:

      Perl 解决方案:

      perl -ne '$count++ if /start/; print if /start/ .. /end/ and 2 == $count'
      

      【讨论】:

        【解决方案3】:
        sed -n '/Storage/,/Design/ H
        /Design/ {
            g
            s/\(.*Storage\)\{2\}/Storage/
            t print
            b
         : print
            p
            q
            }' YourFile
        

        将所有存储部分保留在缓冲区中,当缓冲区添加 2 个存储部分时,请先移除,打印部分并退出。我使用\{2\} 轻松更改选定的出现(如果我记得很好,sed 限制为 255,但很容易解决)

        【讨论】:

          【解决方案4】:

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

          sed -n '/Storage/,/Design/{x;/./{x;p;x};x;/Design/h}' file
          

          正如@jotne 指出的在第二次出现后停止:

          sed -n '/Storage/,/Design/{x;/./{x;p;/Design/q;x};x;/Design/h}' file
          

          【讨论】:

          • 这会打印第二个部分的所有部分,而不仅仅是第二个部分。
          猜你喜欢
          • 1970-01-01
          • 2013-03-12
          • 1970-01-01
          • 1970-01-01
          • 2023-03-31
          • 1970-01-01
          • 2017-11-26
          • 1970-01-01
          相关资源
          最近更新 更多