使用sed在两种模式之间打印行

时间:2017-11-08 12:08:34

标签: bash sed

我有一个看起来像这样的文件:

Index: <filepath>
===================================================================
<lines to print>
<lines to print>
<lines to print>
Index: <filepath>
===================================================================
<lines to print>
<lines to print>
<lines to print>
... and so on

我需要打印以Index:开头的行,跳过包含======的行并打印所有其他行,直到下一个Index:实例

每次文件路径都不同,所以我需要一个与Index:部分匹配的命令并打印整行。

我一直在尝试使用sed命令,但我似乎无法打印出我想要的行。有没有办法可以做到这一点?

预期产出:

Index: <filepath>
<lines to print>
<lines to print>
<lines to print>

2 个答案:

答案 0 :(得分:2)

您可以使用此awk

awk '/^Index:/{p=!p} p && !/^====/' file

Index: <filepath>
<lines to print>
<lines to print>
<lines to print>

<强>详细信息:

  • /^Index:/{p=!p}:当我们在开始时找到Index:设置标记p或重置它(使用p=!p切换效果)
  • p && !/^====/如果标记p1且我们在记录开头没有====,则打印记录。

如果您还要打印下一个Index:行,请使用:

awk '/^Index:/{if (p) print; p=!p} p && !/^====/' file

答案 1 :(得分:1)

我来到了这个命令

sed -n '1,/^Index:/{/^Index:/!d;}; /^Index:/{x;/^$/!p;n;n;}; H; ${g;p;};'
  • 从开始删除到第一个Index:
  • 然后它会保存到保留缓冲区中,从Index:到下一个Index:=======行之外的所有内容都被假定为Index:
  • 当符合Index:行时,如果保留缓冲区的内容不为空,则会打印该内容
  • 当文件结束时,它会打印保留缓冲区的内容

    $ cat /tmp/test
    First line
    Index: <filepath>
    ===================================================================
    <lines to print>
    <lines to print>
    <lines to print>
    Index: <filepath>
    ===================================================================
    <lines to print>
    <lines to print>
    <lines to print>
    
    $ sed -n '1,/^Index:/{/^Index:/!d;}; /^Index:/{x;/^$/!p;n;n;}; H; ${g;p;};' \
    /tmp/test
    Index: <filepath>
    <lines to print>
    <lines to print>
    <lines to print>
    Index: <filepath>
    <lines to print>
    <lines to print>
    <lines to print>
    

    但正如大卫所说,它可以缩短,然后它只是一个简单的

    sed '1,/^Index:/{/^Index:/!d;}; /^=/d;' /tmp/test
    

对于第一个Index之前的行,然后只删除以=开头的行