2010-11-08 7 views
7

Ich versuche, die Unix zu verwenden „sed“ Befehlsform innerhalb einer tcl-Datei, wie folgt aus: (auf mehrere Räume zu einem Raum zu ändern), wie aus einer tcl Datei sed verwenden

exec /bin/sed 's/ \+/ /g' $file 

I auch versucht exec /bin/sed 's/ \\+/ /g' $file (ein extra Backslash)

keine der Version der Arbeit, und ich den Fehler

/bin/sed: -e expression #1, char 1: Unknown command: `'' 

der Befehl funktioniert gut, wenn von einem linux-Terminal laufen

Was mache ich falsch?

Antwort

18

Was mache ich falsch?

Was du falsch gemacht wird mit ' (Apostroph) Zeichen. Sie sind nicht Besonderes . Tcl bei allen Das Äquivalent in Tcl ist ein Wort in { Klammern umschließt }, es gibt keine spezielle Behandlung überhaupt an den Innen Zeichen So, was Sie suchen zu tun wäre.

exec /bin/sed {s/ +/ /g} $file 

Wohlgemerkt, wenn Sie etwas komplexer und die Einschränkung von Tcl zu Voll Worte sein unquoted tun, dann könnten Sie stattdessen gehen:

exec /bin/sh -c "sed 's/ +/ /g' $file" 

Oder echte idiomatische Tcl nur doesn‘ t Einsatz für etwas dieses einfache sed:

set f [open $file] 
set replacedContents [regsub -all { +} [read $f] " "] 
close $f 
+0

+1 für die Vollständigkeit –

1

Verwenden exec /bin/sed "s/\ +/\ /g" $file

Die '\' sagt TCL, dass ein Raum gibt es. Auch mit dem ‚"‘konfiguriert richtig die Zeichenfolge.

+3

Simpler zu tun: exec/bin/sed {s/+// g} $ file - unter Angabe mit {} in Tcl entspricht zitieren mit '' in der Schale. –

+0

nicht erforderlich, um die Leerzeichen innerhalb einer Zeichenfolge in Anführungszeichen zu vermeiden. –

+0

Danke, es funktioniert super :) :) –