구조화된 데이터 파일의 일부를 추출하는 방법

구조화된 데이터 파일의 일부를 추출하는 방법

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

관련 정보