構造化データファイルの一部を抽出する方法

構造化データファイルの一部を抽出する方法

["$AccountWide"] =ファイル間のセクションのすべての行を抽出したいと思います。しかし、私のスクリプトは期待どおりに停止しません。さまざまなソースのコードを組み合わせました。["rules"] =},},

awk '/["$AccountWide"]/ {s=1};   # set the flag s to 1 when ["$AccountWide"] is found
    (s==1 && /["rules"]/) {p=1}; # set the flag p to 1 when s1=1 and ["rules"] is found
    (p==1 && /},/) {s=0};        # set the flag s to 0 when p=1 and }, is found
    (p==1 && s==1) p' x          # if p=1 and S=1 I want print

データファイルは次のとおりです。

    {
            ["$AccountWide"] = 
            {
                ["rules"] = 
                {
                    ["is learnable by Aerithrìa"] = "type(\"motif\", \"recipe\")\nand needlearn(\"Aerithrìa\")",
                    ["#Launder"] = "false",
                    ["#BagtoHomeBank"] = "countBank(\">\", 0)",
                    ["test"] = "(not rule(\"is protected\"))\nand not fcoismarker(constant(\"FCO ignore\"))\n-- and not fcoismarker(constant(\"FCO Quest Item\"))\nand (\n\t\ttype(\"Masterwrit\") and not rule(\"$pricelimit4Writs\")\n\t)",
                },
                ["ruleSets"] = 

答え1

awkを使用してください。

$ awk '
    /\["\$AccountWide"]/  { state=1 }
    state && /\["rules"]/ { state=2 }
    state == 2            { print }
    /},/                  { state=0 }
' file

                ["rules"] =
                {
                    ["is learnable by Aerithrìa"] = "type(\"motif\", \"recipe\")\nand needlearn(\"Aerithrìa\")",
                    ["#Launder"] = "false",
                    ["#BagtoHomeBank"] = "countBank(\">\", 0)",
                    ["test"] = "(not rule(\"is protected\"))\nand not fcoismarker(constant(\"FCO ignore\"))\n-- and not fcoismarker(constant(\"FCO Quest Item\"))\nand (\n\t\ttype(\"Masterwrit\") and not rule(\"$pricelimit4Writs\")\n\t)",
                },

答え2

まあ全体的に同意します管理蜂。なぜ使用するのかわかりませんawk。 awk のマニュアルを確認して、内部変数 RS (レコード区切り記号) と FS (フィールド区切り記号) を使用する方法を学びます。これらの変数は、RS="\[\"rules\"\]"(たとえば、区切り文字を文字列に設定できます)とFS = "\{|\}"(たとえば、区切り文字を次のように設定できます。 )に設定してみることができます。文字列)を「{」または「}」)に変更します。その後、テキストのリクエスタ部分を$ 2として指定できます。

したがって、awkコマンドは次のようになります。

awk 'BEGIN{RS="\[\"rules\"\]";FS="\{|\}"}{print $2}' data.txt

一致するテキストだけでなく、エラーテキストも含めて長いテキストサンプルを表示することをお勧めします。

答え3

私は自分の問題を自分で解決しました。

  1. しばらくすると、MacOSが古いawkを使用していることがわかりました。
  2. 私は元のawkマニュアルに基づいて拡張子なしでこのスクリプトを作成しました。
  3. まず、動作するまですべてのパターンを確認しました。
  4. その後、スクリプトを再クリーンアップしました。働いた。 :)
awk '/\[\"\$AccountWide\"]/ {s=1} 
                (s==1 && /\[\"rules\"\]/) {p=1}
                (p==1 && /\}\,/) {s=0} 
                (p==1 && s==1) {print}' x

関連情報