我有一个看起来像这样的文件:
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>
答案 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 && !/^====/
如果标记p
为1
且我们在记录开头没有====
,则打印记录。如果您还要打印下一个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
之前的行,然后只删除以=
开头的行