我想将和["$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
我自己解决了我的问题:
- 一段时间后我发现 MacOS 使用过时的 awk
- 我根据原始 awk 的手册编写了这个脚本,没有扩展
- 首先,我检查了每一个模式,直到它起作用为止
- 然后我把脚本重新组合起来 - 它起作用了:)
awk '/\[\"\$AccountWide\"]/ {s=1}
(s==1 && /\[\"rules\"\]/) {p=1}
(p==1 && /\}\,/) {s=0}
(p==1 && s==1) {print}' x