[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