如何提取结构化数据文件的一部分

如何提取结构化数据文件的一部分

我想将和["$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

相关内容