Bash regular pro XML

Bash regular pro XML
« kdy: 21. 06. 2019, 10:44:50 »
Ahoj, resim tu jednoduchy xml parser v bashi. potrebuju abych dostal hodnotu ve value podle name.

kus XML co me zajima (muze byt libovolne vnorenej v dalsich tazich):

Kód: [Vybrat]
<property name="PROPETY_NAME" value="https://url.com/cesta/"/>
  # bohuzel obcas i s novym radkem
<property name="PROPETY_NAME"
value="https://url.com/cesta/"/>

     

nejdriv jsem zkusil jen     

Kód: [Vybrat]
             
   echo "$file_content" | grep "PROPETY_NAME" | grep -o 'http.://.*\"' | sed 's/.$//' | sed -n '1p'
coz fungovalo ale bohuzel narazilo to pokud byl tag na vice radcich

tak jsem zkusil pres regular

echo "$file_content" | sed -r -e "/(?:<property name=\"PROPETY_NAME\" value=\")(.*?)(?:\"\/>)/g";

ale to mi moc nefunguje.
nejaky napad prosim?
« Poslední změna: 24. 06. 2019, 08:07:23 od Petr Krčmář »


Re:bash regular pro xml
« Odpověď #1 kdy: 21. 06. 2019, 10:55:35 »
Nápad je jediný: neparsujte XML pomocí regulárních výrazů, protože to nejde. Teď jste narazil na zalomení řádků, pak narazíte na komentáře, entity, CDATA…

Re:bash regular pro xml
« Odpověď #2 kdy: 21. 06. 2019, 11:03:05 »
jo to je mi jasny, taky se mi to moc nezda, ale potrebuju jen tu jednu jedinou hodnotu z jednoho tagu, vic nic takze mi to neprijde zas tak zly

Re:bash regular pro xml
« Odpověď #3 kdy: 21. 06. 2019, 11:08:33 »

Re:bash regular pro xml
« Odpověď #4 kdy: 21. 06. 2019, 11:12:05 »
Raději použijte nějakou utilitu, která vám umožní použít XPath. Bude to mnohem jednodušší na použití a bude to fungovat. Napadá mne třeba XML Shell, vygooglit se toho dá víc.


robin martinez

  • *****
  • 1 138
  • Have you hugged your toilet today?
    • Zobrazit profil
    • Null Storage
    • E-mail
Re:bash regular pro xml
« Odpověď #5 kdy: 21. 06. 2019, 12:43:52 »
A ja se pridam jako dalsi: vyreste to jinak, prevazne, pokud vasi praci po vas nekdo bude prebirat. Ted jsem prebral jednu aplikaci, kde si typek takhle presne resil XML vystup z MySQL a samozrejme po zmene verze se uplne zmenil vystup, takze se cela aplikace dojebala. Pak si to jak idiot cely opravujte po lidech, ktery jsou neschopny a hrajou si na velky programatory :)
One machine can do the work of fifty ordinary men. No machine can do the work of one extraordinary man.

I do Linux, Hardware and spaghetti code in PHP, Python and JavaScript

Kit

  • *****
  • 704
    • Zobrazit profil
    • E-mail
Re:bash regular pro xml
« Odpověď #6 kdy: 21. 06. 2019, 12:57:45 »
Kód: [Vybrat]
xmllint --xpath 'string(//property[@name="PROPETY_NAME"]/@value)' input.xml

Re:bash regular pro xml
« Odpověď #7 kdy: 21. 06. 2019, 12:57:51 »
XML není jazyk regulární, ale vyššího řádu (AFAIK bezkontextový?) - nejde tedy parsovat regulárními výrazy, ale nějaké řádkové parsery by se v repozitáři vaší distribuce měly povalovat: nějaké knihovny má tuším také Python ve své standardní instalaci

D.A. Tiger

  • ****
  • 486
  • Tygr, který žere tučňáka ;-)
    • Zobrazit profil
    • E-mail
Re:bash regular pro xml
« Odpověď #8 kdy: 21. 06. 2019, 13:13:07 »
Ja vim, ze pisete jaoko pozadavek BASH, ale presto Vam to muze trochu pomoci :

http://lua-users.org/wiki/LuaXml
(Classic Lua Verzion)

Osobne jsem to na tak jednochy XML pouzil nekolikrat a nebyl s tim zadny problem. Muzte to pouzit jako tu navrhovanou utilitku, anebo se tim aspon inspirovat.

A nebo se naucit jazyk Lua a pracovat s nim :-D

gill

  • ****
  • 270
    • Zobrazit profil
    • E-mail
Re:bash regular pro xml
« Odpověď #9 kdy: 21. 06. 2019, 13:20:54 »
Kód: [Vybrat]
xmllint --xpath '//property[@name="PROPETY_NAME"]/@value' file.xml | sed 's/value=/\n/g'

gill

  • ****
  • 270
    • Zobrazit profil
    • E-mail
Re:bash regular pro xml
« Odpověď #10 kdy: 21. 06. 2019, 13:24:34 »
Nápad je jediný: neparsujte XML pomocí regulárních výrazů, protože to nejde. Teď jste narazil na zalomení řádků, pak narazíte na komentáře, entity, CDATA…

jde to, většina implementací regulárních výrazů podporuje rekurzivní matche.

Kit

  • *****
  • 704
    • Zobrazit profil
    • E-mail
Re:bash regular pro xml
« Odpověď #11 kdy: 21. 06. 2019, 13:29:23 »
Kód: [Vybrat]
xmllint --xpath '//property[@name="PROPETY_NAME"]/@value' file.xml | sed 's/value=/\n/g'

Má to jednu vadu na kráse: Pokud atribut bude obsahovat nějakou znakovou entitu, tak nebude dekódována. Jinak dobré řešení.

Re:bash regular pro xml
« Odpověď #12 kdy: 21. 06. 2019, 13:36:29 »
jde to, většina implementací regulárních výrazů podporuje rekurzivní matche.
To ale na parsování XML nestačí.

Re:Bash regular pro XML
« Odpověď #13 kdy: 24. 06. 2019, 10:52:46 »
ten xmllint je fajn a vypada ze by fungoval, jen mam starou verzi co neumi xpath.

Re:Bash regular pro XML
« Odpověď #14 kdy: 24. 06. 2019, 11:32:07 »
nakonec jsem preoste grepnul PROPETY_NAME s prepinacem -A 1 a ve vysledku nasel regularem http. snad to bude ok no.