[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