[BSD] kis sed segitseg
Gabor HALASZ
halasz.g at freemail.hu
2012. Okt. 1., H, 11:44:14 CEST
On 10/1/2012 8:29 AM, Zahemszky Gábor wrote:
> Szia!
>
> Bocsánat, most néztem, hogy figyelmetlen voltam. Noha jól írtam a
> magyarázatot :-), nem vettem észre, hogy Mauzi válasza hibás, és nem
> írtam le a jó választ (illetve a több lehetséges közül egyet sem).
>
> Nézzük pontosan: (egy fontos közbeszúrás: a promnpt éls a hibaüzenet
> formája alapján 100%-ra meg vagyok győződve, hogy ez is csh és nem sh.)
>
Akkor ezt tisztazando: az os freebsd 8.2, a shell csh (ez esetben % a
prmpt) es bash ($ prompt volt).
>> % sed -i "s/\"/'/g" /tmp/example.txt
>> Unmatched '.
>
> Itt (meg már az eredeti megoldásodnál is) van egy hiba, ami fölött
> teljesen elsiklottam. Az pedig a -i opció, aminek *kell* egy paraméter,
> ami megadja, hogy mi legyen a backup fájl kiterjesztése.
Nem. De en mar tudom a megoldast, akozben jottem ra, amig azt irtam,
hogy miert nem jo, amit irtal :-D
>
> Hogy a dolog még bonyolultabb legyen, ebben nem igazán egységesek a
> shellek, ráadásul a csh még külön agyament módon dolgozik. Itt a példa:
>
Alapvetoen nincs gondom a shellscript irassal, szerintem ez a sed
problemaja, nem a shell-e.
>
>> % echo "s/\"/'/g"
>> Unmatched '.
>
> Tökre mint az előbb, csak nincs meg a fájlnév, és szerencsére kimaradt
> az amúgy is problémát okozó -i opció.
>
Az echo nem is erti -i-t; azert ezt a kifejezest probaltam, mert
Egervary ur ezt irta, bar nekem nem tetszett igazan, elofordulhat, hogy
en tudok valamit nemjol.
>
> Thát szerintem a helyes megoldás:
>
> $ sed -i "" -e "s/\"/'/g" example.txt
>
> Vizont a tesztek azt mutatják, hogy csh esetén még mindig nem jó, mert
> az idézőjelen belüli \" páros megfekszi a hasát. Így itt a következő:
>
> % sed -i "" -e 's/"/'"'/g" example.txt
>
> Azaz az első felében az idézőjelet aposztrófok közé teszed, a
> másodikban az aposztrófot pedig idézőjelek közé. :-D
Szerintem tulbonyolitod, es ezert kezdesz kicsit zoldsegeket beszelni.
Ahogy nezem, csh-ban egyaltalan nem lehet escapelni az idezojeleken
belul. '"' es "'" mukodik, de a '\'' es a "\"" nem, szemben a bash-shal.
A vegso megoldasom:
sed -i -e s/\"/\'/g example.txt
A problemat a -e hianya okozza. Ha jol megtekinti az ember a manpage
legelejet (en is most vettem eszre), ha az emberfia a sed parancsnal
tobb dolgot akar atadni a sed-nek, akkor a command-ot -e kapcsoloval
kell atadni, ahogy te automatikusan tetted; en viszont nem, igy
tulajdonkeppen irhattam oda barmit, garantaltan hulyeseg lett.
> Ez utóbbi megoldás
> két előnnyel is rendelkezik:
> - FreeBSD alatt megy sh / csh / bash / ksh alatt is
> - soha többet nem rúgnak ki, mert rajtad kívül nem sokan fogják tudni
> megemészteni a kódodat.
>
A vilag mar nem igy mukodik. Ha valakinek nem tudom megemeszteni a
kodjat, akkor kirugom :-D
> No jó szórakozást és kellemes hányást a shellek rejtelmeihez :-)
Nem kell bantani a shelleket, ha az ember pontosan erti, mi tortenik,
akkor nagyon jo kis jatekok.
További információk a(z) BSD levelezőlistáról