シェルスクリプトを使用した非常に簡単なマークアップの解析

シェルスクリプトを使用した非常に簡単なマークアップの解析

非常に単純な構文を持つ構成ファイルであるファイルを解析する必要があります。 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文字一致)行は、そのブロックに従って内容を印刷します。

おすすめ記事