Ersetzen mit sed

M

morbid

Grünschnabel
Hallo zusammen! ich hab da folgendes Problem!

Ich sollte von einer Datei alle ; mit dem ASCII zeichen \\0036 ersetzen

dazu benutze ich folgender Befehl:

sed 's/;/\\0036/g' $fileold > $filenew

Doch dies fuktioniert nicht da \ ein Sonderzeichen von sed ist! Was kann ich tun?

Danke und Gruss Adrian
 
sed 's/;/\\0036/g' $fileold > $filenew
Doch dies fuktioniert nicht da \ ein Sonderzeichen von sed ist! Was kann ich tun?
Escapen: jedes '\' muß mit einem '\' escaped werden.
Folgendes sollte also funktionieren:

sed 's/;/\\\\0036/g' $fileold > $filenew

Gruß
XL
Edit: Thema passt besser nach Programmierung / Shell
 
Hallo

Wenn du das meinst?:
Code:
$ echo ';jj;'|sed -e 's/;/\\\\0036/g'
\\0036jj\\0036

Gruß Wolfgang
edit zu spät, aber egal
 
Danke für die Antworten!!

Doch wenn ich sed 's/;/\\\\0036/g' $fileold > $filenew mache dann fügt er mit \\0036 ein.

Beispiel:
more $oldfile
Eintrag1;Eintrag2

more $newfile
Eintrag1\\0036Eintrag2

Dies ist jedoch nicht genau das was ich will!:)

Wenn ich folgenes mache
print "Eintrag1\\0036Eintrag2" > $newfile

dann erhalte ich folgendes im $newfile

more $newfile

Eintrag1Eintrag2

Das ASCII Zeichen \\0036 wird nicht angezeig ist aber vorhanden, so sollte es auch sein wenn ich es mit sed mache.

Ideen?
 
Versuchs mal als Hex-Code... Das sollte klappen:
Code:
sed 's/;/\x24/g' $fileold > $filenew
Sofern ASCII 'd36' wirklich 'x24' entspricht ;)

Grüsse
d22
 
Zuletzt bearbeitet:
Dies ergiebt den gleichen effekt wie mit dem \\0036.

Statt Eintrag1\\0036Eintrag2
ist nun Eintrag1\\0x1eEintrag2
 
Hm, bei mir klappts:
Code:
$ cat oldfile
Eintrag1;Eintrag2;Eintrag3;
$ sed 's/;/\x2a/g' oldfile
Eintrag1*Eintrag2*Eintrag3*
Wobei, hex '2a' entspricht dez '42' und in ASCII ein '*' ist...

Das ganze geht auch mit dez Werten:
Code:
$ cat oldfile
Eintrag1;Eintrag2;Eintrag3;
$ sed 's/;/\d42/g' oldfile
Eintrag1*Eintrag2*Eintrag3*
Was für eine 'sed' Version verwendest du den?

Gruss
d22
 
Hallo

Warum ersetzt du es nicht einfach durch das entsprechende Zeichen?
\0036 ist oktal 36
Das entspricht
dez 30 hex 0x1E Ctrl-^ RS Record separator

Wenn du das Zeichen direkt ersetzen willst, dann :
Code:
sed 's/;/Ctrl + V + Ctr +^/g'  file

Wobei du die Steuersequenzen so eingeben musst in dein Ersetzenteil.
Also nicht Ctrl V schreiben, sondern Ctrl + V gefolgt von Ctrl + ^ eingeben.
Mit Ctrl + V kannst du alle Steuerzeichen eingeben, ohne dass die Shell es interpretiert.

Gruß Wolfgang
 
Zuletzt bearbeitet:
Danke für eure hilfe! Doch bis jetzt hab ich alles versucht und keine lösung gefunden!

Was für eine sed Version dass ich habe weiss ich nicht. Kannst dumir sagen wie ich das rausfinden kann?

Ich lass das ganze mit ksh auf ner SUN Sparc mit Solaris 5.8 laufen, vielleicht hilft dies jemand. Hier ist auch mal mein ganzes script.

#!/usr/bin/ksh
date +%Y%m%d%H%M%S | read timestamp

filename="./inventorys/Netports_TC-HPOV_FULL_"$timestamp".csv"

sed 's/;/\\0036/g' netports_datarail.txt > $filename

exit 0

Vielleicht brauch ich wirklich eine neuere Version von sed!

Gruss
.
.
.
EDIT (autom. Beitragszusammenführung) :
.

OK i hab ne neie sed Version installiert und nun funktionierts!

sed 's/;/\x1e/g' netports_datarail.txt > $filename

Danke euch!!!!
 
Zuletzt bearbeitet:
Hallo
Meine zweite Version sollte auch bei dir gehen.

Alternativ, kannst du auch eine Variable setzen.
Code:
A=$'\036';
sed -e "s/;/$A/g"
Oder wenn du hast nimm Perl.
Code:
$ echo "ab;cd;ef"|perl -pe 's/;/\036/g'|od -c
0000000   a   b 036   c   d 036   e   f  \n

Gruß Wolfgang
 

Ähnliche Themen

Rekursives Ersetzen

sed - Bitte um Unterstützung

Hilfe für ein shell script

sed in awk

Verzeichnis mit 1200 Dateien auf Verweise in Textdateien checken

Zurück
Oben