Bash

拆分以分號開頭的行分隔的文本

  • January 20, 2020

我有一個命令的輸出(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”值。

引用自:https://unix.stackexchange.com/questions/563022