簡體   English   中英

對兩種模式之間的線條逐漸進行Sed

[英]Sed progressively for lines between two patterns

這是我的示例代碼:

BEGIN
one
one
one one
one
END
filler filler filler filler
BEGIN
two two
two
two two
END
filler filler filler filler
BEGIN
three three three
three three
three
END

我想提取(和包括) BEGINEND之間的線。 我有一個已經這樣做的sed:

sed '/BEGIN/,/END/!d' file

但我想逐步提取模式空間。 也就是說,我可以對上面的sed命令做什么才能輸出第一個塊? 然后第二塊? 第三個? 等等...

(正如你們中的一些人可能猜到的那樣,我的最終目標是使用x509證書解析文件並提取文件中每個證書的數據,而不僅僅是openssl默認執行的文件中的第一個證書。如果有更簡單的話除了以上之外,我都是耳朵)。

我不確定你能在sed輕松做到這一點,但你可以用awk

awk '/^BEGIN$/         { file = sprintf("file%d.out", ++i); }
     /^BEGIN$/,/^END$/ { print > file }' data

這會為第一個塊生成file1.out ,為第二個塊生成file2.out等。


你能解釋一下awk的工作部件嗎?

第一個規則行匹配包含BEGIN行,並使用變量i的計數器在變量file生成文件名(預先遞增,因此第一個文件是file1.out )。

第二個規則行匹配從BEGINEND的行范圍,並使用重定向到變量file指定的當前文件的print (aka print $0 )。 因此,它每次都寫入相關文件。

另外,如何將其更改為輸出內容到stdout? 我希望有一種方法可以指定一個“第N個”模式參數,我將從一個簡單的for循環中提供該參數,該循環運行的次數與發現模式“BEGIN”的總數相同。

您可以通過使用一行來計算塊並跳過除相關塊之外的所有塊,然后只打印相關塊的數據。

awk -v N=$N '/^BEGIN$/         { if (++i != N) next; }
             /^BEGIN$/,/^END$/ { print }' data

-v N=$N將shell變量$N中繼到awk ; 第一行計數(使用i部分,跳過除第N 以外的所有部分。第二行僅在第一行不跳過時觸發,因此它打印第N 塊的內容。一些awk afficionados(可能是APL程序員在業余時間)會省略{ print }塊,但我認為它使代碼更清晰,其他人必須維護代碼。

可以使用相反的方式。 不打印默認值並僅打印圖案之間的線條

sed -n '/BEGIN/,/END/p' <file

使用awk,只導出第二條記錄,不需要遍歷整個文件。 您將在文件“file.out”中獲得結果。 您可以自己定義數字(n = 2)。

n=2
awk -v N=$n '/^BEGIN$/{++i}
     /^BEGIN$/,/^END$/ { if (i==N) {print > "file.out";quit}}'  file

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM