Hallo,
ich kaempfe wieder einmal mit sed.
Gegeben sind in einer Textdatei Zeilen, die mit \ enden.
Mit "sed s/\\//g datei.alt > datei.neu dachte ich, ganz einfach die \
loeschen zu koennen.
Die Folge ist aber eine Fehlermeldung "sed: -e expression #1, char 6:
Unterminated `s' command".
Offensichtlich unterliegen ich einem Denkfehler, aber welchem?
Beste Gruesse,
Heinz.
--
E-Mail: Heinz W. Pahlke
"Heinz W. Pahlke" wrote:
Hallo,
ich kaempfe wieder einmal mit sed.
Gegeben sind in einer Textdatei Zeilen, die mit \ enden.
Mit "sed s/\\//g datei.alt > datei.neu dachte ich, ganz einfach die \ loeschen zu koennen.
Die Folge ist aber eine Fehlermeldung "sed: -e expression #1, char 6: Unterminated `s' command".
versuch's mal mit : sed s/\\\//g Daniel -- Studio Siebel GmbH
On Fri, 13 Jul 2001 at 16:49 (+0200), Heinz W. Pahlke wrote:
Hallo,
ich kaempfe wieder einmal mit sed.
Gegeben sind in einer Textdatei Zeilen, die mit \ enden.
Mit "sed s/\\//g datei.alt > datei.neu dachte ich, ganz einfach die \ loeschen zu koennen.
Die Folge ist aber eine Fehlermeldung "sed: -e expression #1, char 6: Unterminated `s' command".
Offensichtlich unterliegen ich einem Denkfehler, aber welchem?
Die Shell ersetzt das \\ durch \. \ muss aber maskiert werden - entweder "doppelt", also sed s/\\\\//g datei.alt > datei.neu oder das Ersetzen der Shell verhindern mit Hochkommata: sed 's/\\//g' datei.alt > datei.neu Wenn die Zeilen mit \ enden, so wäre aber sed 's/\\$//g' datei.alt > datei.neu sicherer, da nur \ am Ende der Zeile erfasst werden. Gruß, Bernhard -- "Only two things are infinite, the universe and human stupidity, and I'm not sure about the former." [Albert Einstein]
Danke Bernhard und Matthias, On 13-Jul-2001 Bernhard Walle wrote:
Mit "sed s/\\//g datei.alt > datei.neu dachte ich, ganz einfach die \ loeschen zu koennen. [...] Die Shell ersetzt das \\ durch \. \ muss aber maskiert werden -
Das war mir ja auch klar. Deshalb die \\. Mit dem ersten \ dachte ich, waere der zu ersetzende \ masiert. Da ich dachte, dass sed auch noch mal eine eigene Maskierung braucht, hatte ich es sogar mit drei \\\ versucht. Warum habe ich die Reihe nicht einfach fortgesetzt ;-)
entweder "doppelt", also
sed s/\\\\//g datei.alt > datei.neu
oder das Ersetzen der Shell verhindern mit Hochkommata:
sed 's/\\//g' datei.alt > datei.neu
Mit den Hochkommata habe ich es auch versucht, allerdings hier mit nur einem \, weil der \ ja schon vor der Bash versteckt war, wie ich dachte
Wenn die Zeilen mit \ enden, so wäre aber
sed 's/\\$//g' datei.alt > datei.neu
sicherer, da nur \ am Ende der Zeile erfasst werden.
Das ist _der_ Tip, denn ich habe hier auch Dateien, in denen mittendrin
auch ein \ vorkommen kann, allerdings durch \ maskiert. Ich hatte mir
deshalb schon ueberlegt, mit sed diese \\ durch && zu ersetzen, dann
die Zeilenenden-\ zu loeschen und abschliessend die && wieder durch \\
zu ersetzen.
Aber vielleicht haette ich auch noch einen umstaendlicheren Weg
gefunden ;-)
Vielen Dank,
Heinz.
--
E-Mail: Heinz W. Pahlke
On Fre, 13 Jul 2001, Heinz W. Pahlke wrote:
On 13-Jul-2001 Bernhard Walle wrote:
sed 's/\\$//g' datei.alt > datei.neu
sicherer, da nur \ am Ende der Zeile erfasst werden.
Ich habe mir generell angewoehnt, Ausdruecke fuer sed, awk, perl und Konsorten _IMMER_ in '' einzuschliessen, und nur wenn das nicht geht (weil z.B. shell-variablen expandiert werden sollen), auf "" zurueckzugreifen ;)
Das ist _der_ Tip, denn ich habe hier auch Dateien, in denen mittendrin auch ein \ vorkommen kann, allerdings durch \ maskiert. Ich hatte mir deshalb schon ueberlegt, mit sed diese \\ durch && zu ersetzen, dann die Zeilenenden-\ zu loeschen und abschliessend die && wieder durch \\ zu ersetzen.
Hm, da empfehlen sich eigentlich eher unueblichere Zeichen wie z.B.: _¯¡¿¸¨§¶¤þÞ usw... also z.B: sed 's/\\\\/þ/g' und umgekehrt... ^ nein, dass ist _kein_ Komma ;)
Aber vielleicht haette ich auch noch einen umstaendlicheren Weg gefunden ;-)
man tr? Fuer das Problem, dass nur die \ am Zeilenende erkannt werden sollen ist das zwar keine Loesung, generell (fuer die urspruengliche Frage- stellung) waere aber ein "tr -d '\'" passend. -dnh P.S: meine (US-Layout-basierte) .Xmodmap gibt's auf Anfrage ;) -- 284: Nur der Inhalt zählt! Ich war zu blöd, meinen HTML-Editor richtig zu bedienen.
Hallo Heinz, Hallo Liste! Am 13.07.2001 schrieb Heinz W. Pahlke:
Hallo,
ich kaempfe wieder einmal mit sed.
Gegeben sind in einer Textdatei Zeilen, die mit \ enden.
Mit "sed s/\\//g datei.alt > datei.neu dachte ich, ganz einfach die \ loeschen zu koennen.
Die Folge ist aber eine Fehlermeldung "sed: -e expression #1, char 6: Unterminated `s' command".
Offensichtlich unterliegen ich einem Denkfehler, aber welchem?
Dein Denkfehler ist, daß Deine Shell den ersten \ als Escape Zeichen erkennt, und damit \ an sed übergibt. sed denkt dann, Du wolltest den / escapen. sed 's/\\//g' oder sed s/\\\\//g geht. hth, Matthias -- +---------------------------------------------------------+ | Real Men don't make backups. They upload it via ftp and | | let the world mirror it. - Linus Torvalds | +---------------------------------------------------------+
Hallo Heinz, "Heinz W. Pahlke" schrieb:
Hallo,
ich kaempfe wieder einmal mit sed.
Gegeben sind in einer Textdatei Zeilen, die mit \ enden.
Mit "sed s/\\//g datei.alt > datei.neu dachte ich, ganz einfach die \ loeschen zu koennen.
Die Folge ist aber eine Fehlermeldung "sed: -e expression #1, char 6: Unterminated `s' command".
Die Shell schlägt auch noch zu und übersetzt \\ -> \, und damit sieht sed s/\//g, also einenen "escapte"n shlash und versteht das dann als s///, und das ist wirklich zu wenig! Es geht bei mir mt sed 's/\\$//' datei.alt > datei.neu Dollarzeichen in der regex, damit garantiert nur die End-\ erwischt werden. Good luck! Norbert
participants (6)
-
Bernhard Walle
-
D. Wolpert
-
David Haller
-
Heinz W. Pahlke
-
Matthias Pretzer
-
Norbert Kordts