grep + regex

Udv!

adott egy xml file, amiben talalhato egy failures="11" resz.

grep-pel ki kellene tudnom szedni csak es kizarolag a szamerteket

Ha valaki pro regex-ben, tudna segiteni?

elore is koszonom

Hozzászólások

elsore ilyesmi:

$ echo -e "failures=11 foo\nbarother failures=12" | grep -Po "(?<=failures=)\d+"
11
12

Kérlek bocsáss meg, ha valami ostobaságot feltételezek rólad, de ebből a kérdésből nekem úgy tűnik, hogy neked egyáltalában a leghalványabb fogalmad sincs arról, hogyan is működik a UNIX.

Tehát blr megoldása:

grep -Po "(?<=failures=\")\d+(?=\")" akarmi.xml

Az én megoldásom:

cat akarmi.xml | grep failures | sed 's/[a-zA-Z=" ]//g'

További sok sikert!

Erre amugy mi szukseg volt?

Azert kerdezek/kerek segitseget, mert valamihez nem ertek, nem tudom megoldani, elakadtam benne stb. Azt gondoltam egy forum erre valo, es nem szegyen kerdezni. Ezzel szemben neked valamiert fontos volt a fejemhez vagni, hogy "a leghalvanyabb fogalmam sincs rola". Ez semmikepp sem epito kritika, sokkal inkabb serto, pedig en senkihez sem serto hangnemben alltam hozza. Par hozzaszolassal lejjebb egy masik forumtars javaslatanak a segitsegevel meg tudtam oldani, amire szuksegem volt, es ott megkoszontem MINDENKINEK a segitseget.

Bizom benne, hogy jobb lett a napod, az enyemet rosszabba tetted, koszonom, szuksegem volt ra....

Azt sem ertem, aki ehhez meg +1-gyelt is

Legkozelebb tobbszor is meggondolom, hogy kerjek-e barmiben segitseget, amirol a leghalvanyabb fogalmam sincs

U-dash

Legkozelebb tobbszor is meggondolom, hogy kerjek-e barmiben segitseget, amirol a leghalvanyabb fogalmam sincs

Hát itt volna a kutya lényege elásva...

Kaptál két (!) működő megoldást (egyet tőlem, egyet blr-től), majd Zahy-tól még egyet, plusz egy javaslatot egy alternatív eszközre, amit elutasítottál.

Ha neked ebből azt a következtetést sikerült levonnod, hogy nem érdemes kérdezni, akkor tényleg nem érdemes, de ez nem a mi hibánk.

A fórum valóban erre való, kérdezni nem szégyen, de van a nemtudásnak az a szintje, amin csak tanulással lehet segíteni, nem azzal, hogy válaszolunk neked. Az meg a te dolgod.

Felépítettük neked több jó megoldás vázát, arra viszont nem voltunk felkészülve, hogy te valójában azt nem tudod, hogy a grep-nek melyik végén megy be a kőolaj.

Ilyen ez a szeszipar.

Hat nem emlekszem, hogy elutasitottam volna barmit, az adott rendszerhez nincs hozzaferesem, a grep tuti, hogy van, szerintem sed is, a tobbit sajnos nem tudom. Egyiktek megoldasara sem mondtam, hogy rossz, valoszinuleg en nem tudtam ugy hasznalni, ahogy kellett volna, Zachy-et meg igen.

De mindegy, nem leszunk szerintem kozos nevezon, en nem fogadom el, hogy jart nekem a koki, te pedig valoszinuleg nem fogod belatni, hogy felesleges volt a tudasom hianyossagat minositeni. Mindegy, megegyszer a te idodet is koszonom, amit a kerdesemre szantal.

 

udv

U-dash

Egészen biztosan működik a megoldásom, ugyanis voltam annyira alapos, hogy kipróbáljam, mielőtt ideírtam.

Ez az állítás természetesen az itt a fórumon látható teszt bemenetre vonatkozik, és nem a te konkrét anyagodra, hiszem arról nem tudhatok semmit azon kívül, amennyit elárultál róla. Nem szűri ki például az XML-ben szokásos <> karaktereket, már ha vannak a kérdéses formátumú sorokban ilyenek. De ezt hangsúlyozottan nem tudhatom.

Így van.

Erre mondtam, hogy a megoldásom az itt látható teszszövegre helyesen működik, az XML-t meg nem tudhatom, mert sose láttam.

És természetesen erre vonatkozik az a korábbi állításom is, hogy emberünk kapott egy vázat, amit továbbfejleszthetne, ha egyáltalán értene hozzá bármennyire.

Erre megoldás lehet az, ha minden "<" elé, és minden ">" után berak egy sortörést, és az így tördelt fájlon már "rendesen" tud dolgozni egy másik sed:
 

sed 's/</\
</g
s/>/>\
/g' valami.xml | sed -n '/failures/s/\(^.*=\"\)\([0-9.]*\)\(.*$\)/\2/p'

De lehet fordítva is menni: tr -d -vel egy sorba összepakolni, aztán az elejétől a failures=" -ig és a számok és pont utántól mindent törölni...

Igen, szeretem a macskákat és igen, 5 karakterrel rövidebb, így amennyiben ínhüvely gyulladásra optimalizálunk, akkor mindenképpen a tiéd a jobb.

Egyébként pont ugyanilyen vita folyt már itt évekkel ezelőtt és emlékemim szerint ott se sikerült meggyőznöm senkit arról, hogy ilyen esetekben ez max. stiláris kérdés, a gyakorlati jelentősége a nullával egyenlő, hacsak nem valami monumentális adatmennyiséget akarunk feldolgozni, mert ott tényleg van helye efféle optimalizációknak (már nem az ínhüvelynek, hanem mondjuk a futtatott programok számának).

Jelen esetben persze mindez még a lényegtelennél is lényegtelenebb, hiszen a kérdező szerint a megoldásom nem is működik, se macsával, se anélkül. :-D

igen, kb ez lett a jo megoldas:

grep -o 'failures="[0-9][0-9]*"' filename.xml | grep -o '[0-9][0-9]*'

es ez valoban a failures erteket adja vissza idezojelek nelkul.

kicsit fura, hogy egy grep-pel nem megy, de atmenetileg biztosan jo lesz.

koszonom mindenkinek a segitseget
 

U-dash

Nekem még a kis műanyag szappantartó routeremen is van awk, és awk-val az ilyen problémák remekül megoldhatók, mert egyfelől ismeri a regexp-et, másfelől egy teljes scrip nyelv C-hez közeli szintaxissal. Épp ezért kérdeztem, mert awk-ban kb. bármit meg tudsz oldani, ami szöveges file feldolgozása. Vannak változóid, asszociatív tömbjeid, de ha kell, még cosinus függvényed is. :) Persze így, hogy már van megoldás, nem érdekes, inkább általában mondom.

tr '[:lower:]' '[:upper:]' <<<locsemege
LOCSEMEGE

Szerkesztve: 2023. 09. 26., k – 17:46

Talan tudok segiteni: ilyenkor en grep-pel kiszurom a megfelelo sorokat, aztan cut -tal kivagom a megfelelot, kb. igy:

blabla | grep 'failures="' | cut -d'"' -f5

Persze nyilvan a grep-et meg a cut 'field' (f) parameteret be kell allitani. cut szinte biztosan lesz az image-ben, amelyikben grep van.

Mindig meghal egy aranyos kiscica, amikor xml-t greppel valaki.

nem egeszen. alapvetoen a te dontesed, hogy melyik image-n futtatod a github action-t. valasszatok olyat, amin van minden olyan tool, ami a korrekt, jo munkahoz szukseges. Ha nincs, alapvetoen megintcsak trivialis egy Dockerfile-t csinalni, amibe apk/apt -val belerakod, ami kell, es fel-pusholod dockerhub-ra. De legalabbis sokkal gyorsabb, mint orakat szoszolni egy vegeredmenyben megbizhatatlan grep -en, ami az elso xml formatum valtozasra osszefossa magat.