Bash
拆分以分號開頭的行分隔的文本
我有一個命令的輸出(
plantuml -language
; 請參閱BBEdit 的無程式碼語言模組的關鍵字列表、預定義名稱、符號列表?作為背景),它實際上看起來像這樣:;type1 ;3 @fff @ggg hhh ;preprocessor ;1 !undef ;keyword ;3 !undef test somemore . . .
第一個
;
表示名稱,第二個直接;
在下一行表示項目數。這些項目後面是一個空行,下一個塊開始。我想將整個輸出拆分為單獨的文件(以名稱命名),我想進一步處理。
文件
type1
:@fff @ggg hhh
文件
preprocessor
:!undef
文件
keyword
:!undef test somemore
如何使用
awk
或之類的工具來做到這一點sed
?還是有更簡單的工具?
也許不是最優雅的解決方案,但這似乎做到了:
awk -F';' ' NF==0 { next } NF>1 && $1=="" { filename=$2; getline; next } { print > filename } ' file
- 如果欄位數為零(空白行),則繼續下一行。
- 如果欄位數大於一個(以分號開頭的行),則設置 variable
filename
,獲取下一行,但不處理(跳過它)並繼續下一行。- 否則,列印該行並將輸出重定向到文件
filename
。
我會做
awk -F '\n' -v RS= '{f=substr($1, 2); for (i=3; i<=NF; i++) print $i > f}' file
請注意,在 awk-speak 中,一個文件由“記錄”組成,而一個記錄包含“欄位”。預設情況下,一條記錄 == 一行,但這可以配置。
這使用輸入記錄分隔符
RS
變數作為空字元串,這意味著空行序列分隔記錄。我將欄位分隔符設置為換行符。一起,文件的每個“段落”都是一條記錄,段落中的每一行都是一個欄位。該
substr
呼叫只是省略了前導分號。我實際上並沒有檢查數據行數是否實際上等於第二
;
行的“n”值。