2016-05-18 18 views
2

ich einige Probleme mit dem Befehl sed mit:

Ich möchte in einem String, einen Apostroph durch zwei Apostroph
Hier ist meine Zeichenfolge ersetzen:Räume halten, wenn sed Befehl in Kornshell-Skript

04CA07807800106109XE00187200000081960   NI   0780643442  178'0700 

habe ich diese sed Befehl den Apostroph zu ersetzen:

line=`echo $line | sed "s/'/''/g"` 

Das Ergebnis ist

04CA07807800106109XE00187200000081960 NI 0780643442 178''0700 

Wie Sie sehen können, wird das einfache Zitat korrekt durch zwei einfache Anführungszeichen ersetzt.
Aber ich habe alle Leerzeichen zwischen jedem Zeichen meiner Zeichenfolge verloren und ich muss sie wirklich behalten.

Gibt es eine Möglichkeit, diese Räume mit dem Befehl sed zu behalten?
Ich versuchte mit einem tr-Befehl und ich habe das gleiche Ergebnis.

Vielen Dank für Ihre Hilfe.

+0

BTW, 'printf '% s \ n'" $ line "' ist eigentlich ein bisschen korrekter als 'echo" $ line "' (was selbst viel korrekter ist als 'echo $ line') im Umgang mit arbitrary Eingabe - siehe den Abschnitt APPLICATION USAGE von http://pubs.opengroup.org/onlinepubs/009604599/utilities/echo.html –

+1

... btw, http://shellcheck.net/ hätte diesen Fehler für Sie ohne gefunden Menschen involvieren müssen. –

+0

Ich wusste nichts von diesem Zeug. Zur Kenntnis genommen. Vielen Dank ! – Green

Antwort

1

Problem ist nicht sed Befehl sondern Ihre nicht-quoted Variable. Verwendung:

line=`echo "$line" | sed "s/'/''/g"` 

Unquoted variable word splitting Ursachen, die zu echo in mehreren Parametern ergibt, in einzeilig Worten resultiert.

+2

"Nicht-quoted Variable trimmt alle mehrere Leerzeichen in eins." So'ne Art. Es wird [word splitting] (http://mywiki.wooled.org/WordSplitting) durchlaufen, was zu mehreren "echo" -Parametern führt, jedes ohne Leerzeichen. –

+0

Danke, ich habe die Antwort mit korrekterer Erklärung aus deinem Kommentar bearbeitet. – anubhava

+1

Nun, es erweist sich als ziemlich einfach! Danke euch beiden für eure Hilfe :) – Green