awk

Sziasztok!

 

hogy tudom azt awk progfile-lal megtenni, hogy egy fajlbol amiben kapcsos zarojelek tomege van,

ha 2 osszetartozo kapcsos zarolej kozott van az en keresett szovegem, akkor irja ki nekem az osszetartozo kapcsos zarojelek kozotti resz(eke)t?

u.i. a kapcsos zarojelek lehetnek egy masik kapcsos zarojelben is.

Hozzászólások

Szerkesztve: 2022. 09. 20., k – 14:10

https://www.shellhacks.com/sed-awk-print-lines-between-two-patterns/

Nem teljesen definiáltad a problémát. Minden kapcsos zárójel pár közötti szöveget szeretnél kiíratni, esetleg csak a legbelső pár tartalmát? Segítene ha megadnál egy példa be és kimenetet, különös tekintettel az egymásba ágyazott zárójelek esetét.

ebbol [file.txt]:

{
  "cn": 220,
  "cd": "Public",
  "vss": [
    {
      "name": "A.u",
      "id": "A.u",
      "properties": {
        "cn": 41,
        "rn": "u",
        "rd": 27,
        "pm": "A",
        "se": "",
        "as": [
          "a",
          "b",
        ],
        "ns": [
          "A",
          "N"
        ]
      }
    },
    {
      "name": "A.v",
      "id": "A.v",
      "properties": {
        "cn": 42,
        "rn": "v",
        "rd": 28,
        "pm": "B",
        "se": "",
        "as": [
          "c",
          "d",
        ],
        "ns": [
          "B",
          "C",
			{
			  "name": "A.u",
			  "id": "A.u",
			  "properties": {
				"cn": 43,
				"rn": "d",
				"rd": 29,
				"pm": "C",
				"se": "",
				"as": [
				  "a",
				  "b",
				],
				"ns": [
				  "E",
				  "F"
				]
			  }
			}
        ]
      }
    },
    {
      "name": "A.u",
      "id": "A.u",
      "properties": {
        "cn": 44,
        "rn": "x",
        "rd": 30,
        "pm": "L",
        "se": "",
        "as": [
          "p",
          "q",
        ],
        "ns": [
          "X",
          "Y",
			{
			  "name": "A.x",
			  "id": "A.x",
			  "properties": {
				"cn": 48,
				"rn": "u",
				"rd": 33,
				"pm": "K",
				"se": "",
				"as": [
				  "g",
				  "h",
				],
				"ns": [
				  "T",
				  "U"
				]
			  }
			}
        ]
      }
    },
  ]
}

 

ezt [out.txt]:

 

    {
      "name": "A.u",
      "id": "A.u",
      "properties": {
        "cn": 41,
        "rn": "u",
        "rd": 27,
        "pm": "A",
        "se": "",
        "as": [
          "a",
          "b",
        ],
        "ns": [
          "A",
          "N"
        ]
      }
    }
			{
			  "name": "A.u",
			  "id": "A.u",
			  "properties": {
				"cn": 43,
				"rn": "d",
				"rd": 29,
				"pm": "C",
				"se": "",
				"as": [
				  "a",
				  "b",
				],
				"ns": [
				  "E",
				  "F"
				]
			  }
			}
    {
      "name": "A.u",
      "id": "A.u",
      "properties": {
        "cn": 44,
        "rn": "x",
        "rd": 30,
        "pm": "L",
        "se": "",
        "as": [
          "p",
          "q",
        ],
        "ns": [
          "X",
          "Y",
			{
			  "name": "A.x",
			  "id": "A.x",
			  "properties": {
				"cn": 48,
				"rn": "u",
				"rd": 33,
				"pm": "K",
				"se": "",
				"as": [
				  "g",
				  "h",
				],
				"ns": [
				  "T",
				  "U"
				]
			  }
			}
        ]
      }
    }

 

ahol a { utan jon nem { ezzel a patternnel pl.: name A.u

 

awk -f awk.txt file.txt > out.txt

 

Elore is koszonom

Arra vigyázz, hogy ha mondjuk stringben vagy kommentben van { karakter, az meghülyítheti a parzert. Nem tudom fejből a JSON speckót, hogy megengedi-e az ilyen trükköket, de általánosságban is igaz, hogy az adott formátum rendes parzerét érdemes használni nem véletlenül.

Speciális eseteket meg lehet persze kókánnyal is oldani, ha például biztosan tudod, hogy nem lesz benne semmi vicces eset. Aztán 5 év múlva meg lesz, és senki nem fogja tudni, hogy miért nem működik :-)

Akkor tegyed fel a jq-t, nem hiszem el, hogy nem oldható meg. Tényleg nem lerázásból meg rosszindulatból írom, de erre valók a céleszközök, a jq konkrétan nem is egy nagy méretű tool, benne van minden disztró tárolójában, de mivel nem nagy kódméret, akár még forráskódból is bármikor kipörgethető, és ilyenkor még rendszergazdai jog sem kell, legfeljebb a make install részt kihagyod, és csak simán a make után létrejött binárist használod a user mappájából.

Ez a HTML, json, stb. parse-olása tipikusan az a műfaj, amire nem ajánlják a szabályos kifejezéseket, és az ezekhez kapcsolódó eszközöket (sed, grep, awk, pcre, stb.). Nagyon sokan megpróbálták már újra feltalálni a kereket, és regexp-pel nekimenni a témának, de garantált kudarc lesz a vége. Mert a regexp nem tudja értelmezni a beágyazott tag-struktúrákat, főleg, mikor többszörösen vannak egymásba ágyazva, meg bezavar escape-elt karakter is. Értem, hogy mondtad, hogy ilyenek a te fájlodban nem lesznek, és el is hiszem, hogy most nincsenek, de később garantáltan elő fog ilyen kerülni.

A computer is like air conditioning – it becomes useless when you open Windows.” (Linus Torvalds)