簡體   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