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/"
- 1168 megtekintés
Hozzászólások
Minek google, mikor van manual page. 'man sed' es kesz. Amugy meg '-e'.
---
pontscho / fresh!mindworkz
- A hozzászóláshoz be kell jelentkezni
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! :)
- A hozzászóláshoz be kell jelentkezni
Jah, SceneCON nem sokara. :)
---
pontscho / fresh!mindworkz
- A hozzászóláshoz be kell jelentkezni
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.
- A hozzászóláshoz be kell jelentkezni
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! :)
- A hozzászóláshoz be kell jelentkezni
a bash arra jo, amire kitalaltak.
amugy viszonylag gyors, ha nincs agyonpipeolva, es sok mindent bash feature-bol csinalsz
- A hozzászóláshoz be kell jelentkezni
Ok, de most legyszives ne a feladatra, hanem a kerdesre koncentraljatok, mivel ez a kerdes mashol is elofordulhat.
--
Azt akarom, hogy az emberek ne kenyszerbol tanuljanak, hanem azert, mert tudni akarnak.
Ui.: Kezdo Linux-os vagyok, emberi nyelven valaszoljatok! Koszi! :)
- A hozzászóláshoz be kell jelentkezni
$ echo "XXXszovegYYY" | sed "s/XXX\(.*\)YYY/\1/"
- A hozzászóláshoz be kell jelentkezni
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! :)
- A hozzászóláshoz be kell jelentkezni
Ez nem müködik?
sed 's/.*your string is: //
s/hash utani resz.*//
s/[a-z]//g
s/\r//'
- A hozzászóláshoz be kell jelentkezni
Vegul a sed -e "s/egyik/modositas/" -e "s/masik/modositas/"
verzional maradtam, de amugy ez igy nem mukodik nallam.
--
Azt akarom, hogy az emberek ne kenyszerbol tanuljanak, hanem azert, mert tudni akarnak.
Ui.: Kezdo Linux-os vagyok, emberi nyelven valaszoljatok! Koszi! :)
- A hozzászóláshoz be kell jelentkezni
A sed /XXX(.*)YYY/ helyett használd inkább ezt, milliószor gyorsabb (nincs pipe, se fork):
line="XXXvalamiYYY"
echo ${${line##XXX}%%YYY}
Szerk: egyébként meg ezt találtam neked, ha teljesen ki akarod hagyni a sed-et:
http://www.linuxjournal.com/content/bash-regular-expressions
- A hozzászóláshoz be kell jelentkezni
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! :)
- A hozzászóláshoz be kell jelentkezni
Ertem mostmar, hogy mi ez, de nem mukodik, csak ilyen formaban:
line=${line##XXX}; line=${line%%YYY}; echo $line
--
Azt akarom, hogy az emberek ne kenyszerbol tanuljanak, hanem azert, mert tudni akarnak.
Ui.: Kezdo Linux-os vagyok, emberi nyelven valaszoljatok! Koszi! :)
- A hozzászóláshoz be kell jelentkezni