regex YML file-ban, adatként
Hogy a ...ba lehet yml fájlba adatként írni speciális karaktereket tartalmazó sorokat?
Van egy fájlom, ami harminc-negyven python által feldolgozható regex-t tartalmazó sorból áll.
Szeretném áttenni az egészet egy yml formátumú konfig fájlba, de nem megy, mert a yaml parser hülyét kap tőle.
^... .. ..:..:.. \S+ nat: apply nat rules \(/tmp/nat_rules_ppp0_eth0\),
^... .. ..:..:.. \S+ rc_service: check_watchdog 269:notify_rc restart_watchdog$,
Ilyesmi adatok vannak benne.
Ilyet szeretnék:
host-neve:
filter:
- ^... .. ..:..:.. \S+ nat: apply nat rules \(/tmp/nat_rules_ppp0_eth0\)
- ^... .. ..:..:.. \S+ rc_service: check_watchdog 269:notify_rc restart_watchdog$
Amiből szeretném, ha kapnék egy tömböt, ami a host nevekből áll, amelynek vannak filter nevű tömb elemei, amelyek a fenti sorokat tartalmazzák:Amíg csak sima textfájlban tartom ezeket, addig semmi gond, de mivel teli vannak spec. karakterekkel, köztük aposztróf, idézőjel, backslash, kettőspont, mínusz jel...
Nem igazán tudom úgy formázni, hogy a yaml parser elfogadja.
Van valakinek ötlete?
Az egyik érzékeny pontja a :, de ezt sem \:, sem :: formában nem eszi meg.
Idézőjelbe és aposztrófok közé sem tehetem a teljes sort, akkor a \ miatt sír és a \\ sem jó neki.
■ Van egy fájlom, ami harminc-negyven python által feldolgozható regex-t tartalmazó sorból áll.
Szeretném áttenni az egészet egy yml formátumú konfig fájlba, de nem megy, mert a yaml parser hülyét kap tőle.
^... .. ..:..:.. \S+ nat: apply nat rules \(/tmp/nat_rules_ppp0_eth0\),
^... .. ..:..:.. \S+ rc_service: check_watchdog 269:notify_rc restart_watchdog$,
Ilyesmi adatok vannak benne.
Ilyet szeretnék:
host-neve:
filter:
- ^... .. ..:..:.. \S+ nat: apply nat rules \(/tmp/nat_rules_ppp0_eth0\)
- ^... .. ..:..:.. \S+ rc_service: check_watchdog 269:notify_rc restart_watchdog$
Amiből szeretném, ha kapnék egy tömböt, ami a host nevekből áll, amelynek vannak filter nevű tömb elemei, amelyek a fenti sorokat tartalmazzák:
eredmeny_tomb['host-neve']['filter'] = ['^... .. ..:..:.. \S+ nat: apply nat rules \(/tmp/nat_rules_ppp0_eth0\)','^... .. ..:..:.. \S+ rc_service: check_watchdog 269:notify_rc restart_watchdog$']
Nem igazán tudom úgy formázni, hogy a yaml parser elfogadja.
Van valakinek ötlete?
Az egyik érzékeny pontja a :, de ezt sem \:, sem :: formában nem eszi meg.
Idézőjelbe és aposztrófok közé sem tehetem a teljes sort, akkor a \ miatt sír és a \\ sem jó neki.
https://www.yaml.info/learn/q
Köszi, ennek egy
Lehet, hogy a pythonos parser nem 100%-os?
Közben találtam egy online checkert, megpróbálom azon kipofozni.
Python alól nagyon nem megy.
...
És akkor most jött el a pillanat, hogy a kb. tíz éve foltozgatott pythonos és bash szkriptes repokat a backupokkal és online másolataikkal együtt töröljem.
Egyszerűen nem boldogulok vele. Ha idézőjelbe teszem, az se jó, mert vannak regex sorok, amikben idézőjel is kell.
Escape nem úgy működik, ahogy kellene, mert a \: nem tetszik neki, a \\: jó a parsernek, de abból nem : jön vissza, hanem \:.
Öreg vagyok én már ehhez... :(
(úgy értem ahhoz, hogy ilyen logikátlanul működő fasságokkal rongáljam az idegeimet)
Próbáld meg \\\-el is hátha.
TL;DRa teljes sort '-k közé,
a teljes sort '-k közé, ahol ' van, ott ''-t(két '-t, nem "-t!) használni.
---
Amennyire még volt türelmem olvasni, úgy tűnik, a kettőspont+ szóköz így együtt egy olyan kombináció, amit nem lehet escape-pel eltüntetni.
Az egyetlen opció, hogy aposztrófok közé teszem a teljes sort.
Ilyenkor egy gond van, ha az ott lévő regex is tartalmaz aposztrófot. Mert a mai programnyelveknél megszokta az ember, hogy escape=\, az meg itt nem működik. Ilyenkor a ' helyett '' kell...(szóval egy ' helyett kettő)
És a megoldás...
Szerk: közben rászántam magam, hogy átnézzem az eredményt: a teljes sort aposztrófok közé kell tenni, az esetleg felbukkanó aposztróf karaktereket pedig duplázni kell.
Aposztróf aposztrófok közt, bash szkriptben
Ugyan pythonból megoldottam a posztot ihlető problémát, de próbáltam shellből is.
Hááát...
Itt szállítják a megoldást
Az awk ' ... ' helyére awk $' ... ' kell és máris jó.
Ha már escape...
Volt egy text file-om, amibe valahogy bekerült némi bináris szemét.
Meg akartam keresni, először úgy, hogy
grep '[^[:alnum:]\<\>\.\:\[\]]'
A \] nem tetszett neki. Mint kiderült, roppant logikusan a ]-t nem lehet escape-elni:
grep '[^]\[[:alnum:]\<\>\.\:]'
Hát humoros, na...
(persze a valódi megoldás a grep '[^[:print:]]' lett...)