2009-10-20 6 views
8

File1 zu löschen:Verwenden sed alle führenden/nachgestellten Leerzeichen in einer Textdatei

hello 
    world 

Wie würde man die Vorder-/Hinter Leerzeichen innerhalb dieser Datei mit sed löschen - mit einem Befehl (keine Zwischendateien)?

habe ich zur Zeit habe:

sed -e 's/^[ \t]*//' a > b 

Für führende Leerzeichen.

sed 's/ *$//' b > c 

Und dies für nachfolgende Leerzeichen.

+0

Während @ ghostdog74's Antwort ist eine gute, @ mouviciel's Antwort ist die * richtige * eine, je nach Ihrer Frage. Ich habe beide aufgewertet, aber ich glaube @mouviciel verdient es, als die richtige Antwort akzeptiert zu werden. –

+0

Sie haben Recht - mouviciel wird jetzt akzeptiert. Danke an mouviciel (richtige Antwort) und ghostdog74 (Richtung awk) für ihre Zeit! – user191960

Antwort

10

Du hast es fast:

sed -e 's/^[ \t]*//;s/[ \t]*$//' a > c 

Darüber hinaus auf einigen Aromen von sed, gibt es auch eine Option für die Bearbeitung inline:

sed -i -e 's/^[ \t]*//;s/[ \t]*$//' a 
+3

Ich würde auch in Betracht ziehen, '\ s' zu entsprechen, was die generischen" alle Leerzeichen "sind. –

+0

Sollte es nicht 'sed -e '/^[\ t] * //; s/[\ t] * $ //' a> c' sein? –

+0

Ich sehe immer noch 'sed -e '/^[\ t] * //; s/[\ t] * $ /' a> c' was bei mir nicht funktioniert (bash version 4.3.30, Funtoo-Linux)). –

7

einfache Art und Weise, mit awk

awk '{$1=$1}1' file 

oder

awk '{gsub(/^ +| +$/,"")}1' file 
+0

Die erste funktionierte perfekt und ist die einfachste - ich weiß es nicht was ich fragte (d. H. Sed) - aber es ist so elegant :). Ich werde jetzt in awk schauen. – user191960

+0

Der erste entfernt alle unechten Leerzeichen, nicht nur das führende und das nachfolgende.Der zweite funktioniert am besten. 'awk' ist ein großartiges Werkzeug. – mouviciel

+0

Ah, ich sehe jetzt die anderen Leerzeichen mit dem ersten entfernt - das zweite funktioniert ohne zusätzliche Löschungen. – user191960

3
perl -lape 's/^\s+|\s+$//g' 

Ehrlich gesagt, weiß ich Perl Regexps die beste, so finde ich perl -lape viel einfacher als sed -e zu verwenden.

Auch die ursprüngliche Frage zu beantworten, können Sie mehrere Operationen wie folgt ausführen haben sed:

sed -e 's/something/something else/' -e 's/another substitution/another replacement/' 

Anscheinend kann man auch die beiden Substitutionen in einer Zeichenfolge setzen und sie mit einem Semikolon getrennt, wie in angezeigt eine andere Antwort.

0

Beachten Sie, dass in dem allgemeineren Fall zu einer Eingabedatei in einer Reihe mehrere Filter anwenden, ohne Zwischendateien zu verwenden, die Lösung Rohre verwenden:

sed -e 's/^[ \t]*//' a | sed -e 's/ *$//' > c 

Offensichtlich sind sie hier nicht erforderlich, da ein Aufruf von sed ist ausreichend, aber wenn der zweite sed Befehl etwas anderes ist, wie uniq oder sort, dann ist dieses Muster das richtige.