コマンドの出力があります(plantuml -language
;参照BBEditコードレス言語モジュールのキーワード、事前定義された名前、記号のリストはありますか?背景)実際には次のようになります。
;type1
;3
@fff
@ggg
hhh
;preprocessor
;1
!undef
;keyword
;3
!undef
test
somemore
.
.
.
1 番目は;
名前を表し、2 番目は;
次の行のエントリ数を表します。これらの項目の後には、次のブロックが始まる空白行が続きます。
出力全体をさらに処理する別のファイル(名前付き)に分割したいと思います。
文書type1
:
@fff
@ggg
hhh
文書preprocessor
:
!undef
文書keyword
:
!undef
test
somemore
のようなツールを使用してawk
これをどのように実行できますかsed
?それとも簡単なツールがありますか?
答え1
おそらく最もエレガントな解決策ではないかもしれませんが、これはうまくいくようです:
awk -F';' '
NF==0 { next }
NF>1 && $1=="" { filename=$2; getline; next }
{ print > filename }
' file
- フィールド数が0(空行)の場合は、次の行に進みます。
- フィールド数が1(セミコロンで始まる行)を超える場合は、変数を設定して次の行を取得しますが、処理せずに
filename
(スキップして)次の行に進みます。 - それ以外の場合は、その行を印刷して出力をファイルにリダイレクトします
filename
。
答え2
やるよ
awk -F '\n' -v RS= '{f=substr($1, 2); for (i=3; i<=NF; i++) print $i > f}' file
awk 言語では、ファイルは「レコード」で構成され、レコードには「フィールド」が含まれます。既定では、1 つのレコード == 1 行ですが、構成できます。
これは、入力レコード区切りRS
変数を空の文字列として使用します。つまり、一連の空行がレコードを区別するという意味です。フィールド区切り文字を改行文字に設定しました。要約すると、ファイルの各「段落」はレコードであり、段落内の各行はフィールドです。
呼び出しsubstr
では、先行セミコロンのみが省略されます。
実際には、データ行の数が2番目の行の「n」値と実際に等しいことを確認するものではありません;
。