ugrás a tartalomhoz

regex YML file-ban, adatként

mind1 valami név · 2020. Nov. 13. (P), 17.17
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:
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$']
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.
 
1

https://www.yaml.info/learn/q

inf · 2020. Nov. 13. (P), 17.26
2

Köszi, ennek egy

mind1 valami név · 2020. Nov. 13. (P), 17.53
Köszi, ennek egy variációjával próbálkoztam :)
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)
4

Próbáld meg \\\-el is hátha.

inf · 2020. Nov. 14. (Szo), 02.51
Próbáld meg \\\-el is hátha.
5

TL;DRa teljes sort '-k közé,

mind1 valami név · 2020. Nov. 14. (Szo), 07.13
TL;DR
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ő)
3

És a megoldás...

mind1 valami név · 2020. Nov. 13. (P), 20.10
Írok egy három soros python programot, ami beolvassa az eredeti text fájlt a megfelelő tömbbe, majd a yaml.safe_dump() segítségével kiírom fájlba.


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.
6

Aposztróf aposztrófok közt, bash szkriptben

mind1 valami név · 2020. Nov. 14. (Szo), 13.05
Ma se keltem hiába.
Ugyan pythonból megoldottam a posztot ihlető problémát, de próbáltam shellből is.
Hááát...

cat ~/bin/pattern.txt | awk 'BEGIN { print("IPaddr:"); print("  kern:"); } //{ print "    -  '$0'" }'
Úgy képzeltem, hogy ezzel vagy úgy, hogy a $0 körüli '-k escape-elve vannak (\'$0\') működnie kellene. Hát nem. A bash nem eszi meg, úgy csinál, mintha nyitva hagytam volna egy stringet.
Itt szállítják a megoldást
Az awk ' ... ' helyére awk $' ... ' kell és máris jó.
7

Ha már escape...

mind1 valami név · 2020. Nov. 15. (V), 17.14
Megint tanultam valami újat:
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...)