[英]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 && !/^====/
如果标志p
为1
并且我们在记录的开头没有====
,则打印该记录。 如果要打印下一个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.