[BSD] kis sed segitseg

gabor at zahemszky.hu gabor at zahemszky.hu
2012. Okt. 1., H, 14:09:59 CEST


 Szia!

 Akkor újra nekifutok. És mire a hét véget ér, te kijavítod az én összes 
 hibámat,
 én meg a toedet, és a vgée érünk.

>>> % 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

 További pontosítás:

 fenntartom, hogy a -i opcióhoz *kell* paraméter (a te végső 
 megoldásosban is hibás),
 viszont ez nem derül ki, mert odáig nem jut el a shell. Az "Unmatched 
 blabla" a shell
 hibaüzenete, amit csh esetén már nem követ a parancs lefutása, tehát 
 nem derül ki
 hogy a -i-vel további hibák vannak.

>> 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.

 Sajnos az eredeti felállásban a shell okozott sok bajt.

>> 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.

 Az első felével teljesen egyetértek, a másodikat visszautasítom :-)

> Ahogy nezem, csh-ban egyaltalan nem lehet escapelni az idezojeleken
> belul. '"' es "'" mukodik, de a '\'' es a "\"" nem, szemben a
> bash-shal.

 Viszont a fordítottja az megy mindenütt - amit írtam. Aposztrófok közé
 idézőjel, és idézőjelek közé aposztróf.

> A vegso megoldasom:
>
> sed -i -e s/\"/\'/g example.txt

 Igen, az már kiderült, hogy túlbonyolítottam a dolgot, és a sed-nek
 odaadandó paraméter így néz ki, azaz nem kell az egészet 
 aposztrófok/idézőjelek
 közé tenni, hanem csak simán backslash. De még így se jó a parancs :-)

> A problemat a -e hianya okozza.

 Félig van csak igazad. Változatlanul azt mondom, hogy a -i-nek kell 
 paraméter.
 Eme fenti parancs kimenete nálam:

 $ ls -l ex*
 -rw-r--r--  1 zgabor  wheel  12 okt  1 13:08 example.txt
 $ sed -i -e s/\"/\'/g example.txt
 $ ls -l ex*
 -rw-r--r--  1 zgabor  wheel  12 okt  1 13:43 example.txt
 -rw-r--r--  1 zgabor  wheel  12 okt  1 13:08 example.txt-e
 $

 Remélem látszik a gond. Az example.txt valóban jó, de nem helyben csere
 történt, hiszen megjelent a "-e" végződésű backup-fájl.

> 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 csak félig magyarázat, ugyanis egyetlen sed-parancsot adtál meg, 
 azaz nem kellene
 az a -e opció (az más kérdés, hogy én szoktam használni). Ha kihagytad 
 volna, akkor
 azért nyafogott volna a sed, hogy az "example.txt" számára nem érthető 
 parancs.
 (És az s/././g sztring lett volna az a kiterjesztés, amit a backup 
 fájlhoz
 hozzáragaszt a sed.) Mint azt valamelyik korábbi példádnál is tette. 
 Íme:

 $ csh
 %sed -i s/\"/\'/g example.txt
 sed: 1: "example.txt": invalid command code e
 %

> Nem kell bantani a shelleket, ha az ember pontosan erti, mi tortenik,
> akkor nagyon jo kis jatekok.

 De mint látszik, ez jelenleg egyikünknél sem áll fenn.

 Zahy < Gabor at Zahemszky dot HU >



További információk a(z) BSD levelezőlistáról