sed - tobb utasitas egy sorban

Fórumok

A problemam az, hogy egy idore meno kuldetes kell vegrehajtanom:
1 masodpercen belul le kell kernem egy weboldalt, manipulalni a rajta levo sztringgel, majd a vegeredmenyt vissza kell kuldenem.
Ehez ugye marha gyors szkript kell, amit (hogy tanuljam es jobban megismerjem) BASH-t hasznalok, a szoveget, amin manipulalni kell, 'sed'-del szedem ki: (egy hash-bol kell kivalogatni a szamokat)

hash=`echo $hash | sed "s/.*your string is: //" | sed "s/hash utani resz.*//" | sed "s/[a-z]//g" | sed "s/\r//"`

Az a baj, hogy igy a 'sed' negyszer fut, ahelyett, hogy egyszeri futassal megcsinalni minden szukseges valtoztatast. Szeretnem valahogy egyetlen sorban megoldani a feladatot, hogy ezzel is idot sporoljak, de Google nem adott tul sok hasznalhato linket. (volt egy csomo 'one-liner', de abban sem ertettem meg, hogy hogy is lehet egy soros szkriptet irni)

'sed' megoldas:

hash=`echo $hash | sed -e "s/.*your string is: \(.*\)hash utani resz.*/\1/" -e "s/[a-z]//g" -e "s/\r//"`

A masik kerdesem az, hogy ugyebar kozre lehet fogni az illeszkedest, de hogy lehetne egy soron belul az illeszkedon kivuli szoveget kivalogatni? Marmint:

Illeszkedes kozrefogasa:

$ echo "szoveg" | sed "s/.*/XXX&YYY/"
> XXXszovegYYY

"Kivalasztas": (idiota kod, ne probaljatok ki)

$ echo "XXXszovegYYY" | sed "s/XXX*YYY/&/"
> szoveg

'sed' megoldas:

$ echo "XXXszovegYYY" | sed "s/XXX\(.*\)YYY/\1/"

Hozzászólások

Minek google, mikor van manual page. 'man sed' es kesz. Amugy meg '-e'.

---
pontscho / fresh!mindworkz

Egen, mar probaltam, de legutobb valamiert nem mukodott, most meg jo. :) (valszeg valami karaktert benne hagyhattam, ami nem kellett oda)

[OFF]
Lesz mostanaban valami Demoscene buli?
[/OFF]
--
Azt akarom, hogy az emberek ne kenyszerbol tanuljanak, hanem azert, mert tudni akarnak.
Ui.: Kezdo Linux-os vagyok, emberi nyelven valaszoljatok! Koszi! :)

csoportosítás? () és \1..\9?

De amúgy ha sebesség kell akkor miért bash? írd meg c-ben. Az gyors lesz. A bash/sed nem arról híres, hogy egy kapkodó ideg bolond.

Na, ezzel most ki vagyok segitve. Nem tudnad pontosabban, hasznalhato formaban leirni a valaszt?
Amugy azert akarom BASH-ban megirni, hogy megtanuljam rendesen hasznalni. Aztan ha megtanultam, megirom C-ben is. Meg PHP-ban. Meg minden nyelvben, amivel epp foglalkozom. :)
--
Azt akarom, hogy az emberek ne kenyszerbol tanuljanak, hanem azert, mert tudni akarnak.
Ui.: Kezdo Linux-os vagyok, emberi nyelven valaszoljatok! Koszi! :)

Igen, ezt szerettem vola latni. Koszonom! :) Monnyuk ettol fuggetlenul meg mindig nem mukodik a skriptemen belul, de ezt mar megoldom. Amugy egy meg nehany kerdes ezzel kapcsolatban:
Ahogy nezem, ez az utolso illeszkedest jegyzi meg (a legnagyobb illeszkedes "torvenye" miatt). Hogy lehetne az elso illeszkedest lekerni?

$ echo "XXXelsoYYYXXXmasodikYYYXXXharmadikYYY" | sed "s/XXX\(.*\)YYY/\1/"
> elsoYYYXXXmasodikYYYXXXharmadik

$ echo "XXXelsoYYYXXXmasodikYYYXXXharmadikYYY" | sed "s/.*XXX\(.*\)YYY/\1/"
> harmadik

Vagy - egy masik iranybol nezve - hogy lehet a legnagyobb illeszkedest kizarni / szukiten?
--
Azt akarom, hogy az emberek ne kenyszerbol tanuljanak, hanem azert, mert tudni akarnak.
Ui.: Kezdo Linux-os vagyok, emberi nyelven valaszoljatok! Koszi! :)

Ez nem müködik?

sed 's/.*your string is: //
s/hash utani resz.*//
s/[a-z]//g
s/\r//'

O_O Jesszus... Ez igy eleg groteszkul nez ki, de mindjart atlesem, ugyis epp a BASH mukodesenek megismeres miatt csinalom ezt a feladatot shell-szkriptben.
--
Azt akarom, hogy az emberek ne kenyszerbol tanuljanak, hanem azert, mert tudni akarnak.
Ui.: Kezdo Linux-os vagyok, emberi nyelven valaszoljatok! Koszi! :)