["$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