繁体   English   中英

使用sed在2种图案之间打印线条

[英]Using sed to print lines between 2 patterns

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

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:实例Index:

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

我一直在尝试使用sed命令,但似乎无法获得它来打印我想要的行。 有办法吗?

预期输出:

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

您可以使用以下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

我想到了这个命令

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> 

    但正如David所提到的,可以将其缩短,然后将其简化

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

这与第一个Index之前的行相同,然后删除以=开头的行

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM