[英]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.