Mulla on shell-skriptissä seuraavanlainen greppi, jolla pitäis hakea XML-dokumentista yhden elementin sisältö. Erityisesti 7-merkkiä pitäisi vain poimia.
grep -i -E -o '().*()[A-Z0-9]{7}'
Tuo ei kuitenkaan palauta mitään. En ole mestari näissä regexp-asioissa, joten miten tuo aakkosnumeerinen merkkimäärä pitää ilmoittaa?
grep -i -E -o '().*()[A-Z0-9]{7}'
Tuo ei kuitenkaan palauta mitään. En ole mestari näissä regexp-asioissa, joten miten tuo aakkosnumeerinen merkkimäärä pitää ilmoittaa?
Vastaukset 3
Vanhimmat
Niin tuon komennon piti vielä jatkua toisella putkitetulla komennolla sed.
grep -i -E -o '().*()[A-Z0-9]{7}' |
sed -n -e 's/.*\(.*\).*/\1/p'
tuolla sedillä käsittääkseni sitten pitää palauttaa se poimittu arvo. Eli olisiko oikeaoppisesti niin, että tuo poimittavan merkistön pituuden määritys olisikin sedissä?
Säännöllinen lauseke
().*()[A-Z0-9]{7}
tarkoittaa, että ensin pitää lukea , sitten saa tulla mitä merkkiä vain kuinka paljon vain, sitten pitää tulla ja heti sen jälkeen pitää olla seitsemän kappaletta merkkejä joukosta A-Z tai 0-9.
Kristallipalloni kertoo, että oikeasti haluaisit noiden seitsemän merkin olevan Data-tagien välissä. Silloin säännöllisen lausekkeen pitäisi olla
()[A-Z0-9]{7}()
Jos haluat tulostaa pelkästään Data-tagien välissä olevat merkit, helpointa lienee tehdä se Perlillä:
perl -ne 'print if s/([a-zA-Z0-9]{7})/\1/g;'
ettei tarvitse sedailla grepin jälkeen.
No entäs sitten, kun halutaan poimia merkkijonon alusta vain tietyn verran merkkejä, esim. tuo mainittu 7 merkkiä?