
非常に単純な構文を持つ構成ファイルであるファイルを解析する必要があります。 2種類の複数行ブロックとインラインタグがあります。
タイプ 1 ブロックは以下で構成されます。オープンラベルそして終了タグブロック名を追加してください。例:
START_BLOCK_1 name
< content >
END_BLOCK_1
タイプ1ブロックには、デフォルトでそのプロファイルのブロックをオンまたはオフにするために使用されるタイプ2ブロックのみが含まれています。
タイプ2のブロックは、新しい行を開始するマーカー(および名前)で表され、新しいブロックの開始時またはファイルの終了時に暗黙的に終了する非終了マーカーがあるため、ブロック自体に空白行を含めることができます。
START_BLOCK_2 name_1
< content >
< content >
< content >
START_BLOCK_2 name_2
< content >
< content >
< content >
START_BLOCK_2 name_3
< content >
< content >
最後の種類のタグは、行の先頭に表示される特別な単語であるインラインタグだけです。そのタグの値が何であるかを知りたいです。
START_BLOCK_2 name_1
tag_1 red
tag_2 Jon
START_BLOCK_2 name_2
tag_1 blue
tag_2 Phil
最後の良い例は次のとおりです。
START_BLOCK_2 name_1
< content >
START_BLOCK_2 name_2
< content >
START_BLOCK_1 name_1
START_BLOCK_2 name_3
< content >
START_BLOCK_2 name_4
< content >
END_BLOCK_1
START_BLOCK_2 name_5
< content >
タイプ2ブロックの名前が与えられたら、各タグに関連付けられている値(すでに設定されているタグが含まれている場合)と、そのタグがタイプ1ブロックの一部であるかどうか(この場合はタイプ1ブロックの名前属性)を知る必要があります。それらが含まれています。
結果はファイルに保存または印刷でき、解析できる限り後で出力をフォーマットされた方法で読み取ることができます。
このファイルを解析するのは比較的簡単ですが、GNU / linuxシェルでのみこのようなことをしたことはありません。
編集する
入力する
START_BLOCK_2 opt1
color red
START_BLOCK_1 opt2
START_BLOCK_2 opt3
name Jon
START_BLOCK_2 opt4
color blu
END_BLOCK_1
期待される出力
opt1 red
opt3 opt2
opt3 Jon
opt4 opt2
opt4 blu
答え1
awk
出力例に空白行を望まないと仮定する解決策は次のとおりです。
awk '/START_BLOCK_1/ { block1=$2; next; } \
/END_BLOCK_1/ {block1=""; next; } \
/START_BLOCK_2/ { block2=$2; next; } \
/./ { if(block1) {print block2 " " block1} if(block2) { print block2 " " $2}
}' inp
各行の開始または終了ブロックを一致させることで動作します。 BLOCK_1に「含まれている」場合は、変数に名前を設定してくださいblock1
。 BLOCK_2に「含まれている」場合は、その名前を変数に設定しますblock2
。定義されたブロックがなく空でない(最低1文字一致)行は、そのブロックに従って内容を印刷します。