Wie passt man Whitespace in Sed an?

257330
Peter Smit

Wie kann ich Whitespace in Sed abgleichen? In meinen Daten möchte ich alle 3+ aufeinander folgenden Whitespace-Zeichen (Tabulatorzeichen) abgleichen und sie durch 2 Leerzeichen ersetzen. Wie kann das gemacht werden?

192

4 Antworten auf die Frage

200
mrucci

Die Zeichenklasse \sstimmt mit den Whitespace-Zeichen <tab>und überein <space>.

Zum Beispiel:

$ sed -e "s/\s\/ /g" inputFile 

ersetzt jede Sequenz von mindestens 3 Leerzeichen durch zwei Leerzeichen.


ANMERKUNG : Verwenden Sie für die POSIX-Kompatibilität die Zeichenklasse [[:space:]]anstelle von \s, da letztere eine Erweiterung von GNU sed ist. Siehe die POSIX-Spezifikationen für sed und BREs

Aha! Es war der fehlende Schalter, der mich erwischt hat. sequoia mcdowell vor 12 Jahren 2
Ich musste auch den '-r' Schalter hinzufügen, der es erweiterten Regex erlaubt, '\ s' als Leerzeichen zu erkennen. HUB vor 11 Jahren 21
Bei Apples `sed` musste ich` [[: space:]] `verwenden, da` \ s` bei mir nicht funktionierte. Vielleicht ist `\ s` eine Erweiterung von [GNU sed] (http://www.gnu.org/software/sed/)? Jared Beck vor 10 Jahren 30
@ JaredBeck danke, es liefen die Ideen aus, warum mein einfacher regulärer Ausdruck nicht funktionierte. Das ist lahm, ich dachte, es war ein Standard-regulierter regulärer Ausdruck. Auch -r funktioniert nicht und -E hat gedrungen Karthik T vor 10 Jahren 2
Danke für die Rückmeldung. Ich habe die Antwort mit Links zum POSIX-Standard aktualisiert. mrucci vor 10 Jahren 1
Für mich hat "-e" * aufgehört * zu funktionieren, aber "-r" hat funktioniert (Mint 16). Ich musste also von `sed -e -r` zu` sed -r` wechseln. Allerdings benutzte ich zu diesem Zeitpunkt `[[: space:]]`, da ich `\ s` nicht zur Arbeit bekam. Darren Cook vor 9 Jahren 0
Ähnlich wie bei der POSIX-Zeichenklasse [: space:] `passt` \ s` nicht nur auf ```und``, aber auch das``character (versuche 'sed' N; s / \ s / x / '<<< $' aaa \ nbbb 'in bash). Witiko vor 7 Jahren 0
[GNU sed manual] (https://www.gnu.org/software/sed/manual/html_node/Escapes.html) listet nicht als GNU-Erweiterung auf. jarno vor 7 Jahren 0
Anstelle von [[: Leerzeichen:]] könnten Sie auch [[: Leerzeichen:]] verwenden, das nur mit horizontalen Tabulatoren und Leerzeichen übereinstimmt (aber keine Zeilenumbrüche, vertikalen Tabulatoren usw.). stefanct vor 6 Jahren 1
55
some ideas

Dies funktioniert unter MacOS 10.8:

sed -E "s/[[:space:]]+/ /g" 
Wissen Sie, ob dies auf allen Linux-Distributionen funktioniert? amphibient vor 10 Jahren 2
Normalerweise hat [GNU sed] (http://www.gnu.org/software/sed/manual/sed.html) kein -E. Von der BSD-Sed-Man-Seite: "Die Optionen -E, -a und -i sind nicht standardmäßige FreeBSD-Erweiterungen und möglicherweise nicht für andere Betriebssysteme verfügbar." Brad Koch vor 10 Jahren 2
Warum benötigen Sie die Markierung -E für den Operator +? Die meisten Ausdrücke würden stattdessen wahrscheinlich mit * in Ordnung sein, dann würde dies auf anderen Plattformen funktionieren. Samuel vor 9 Jahren 1
@Samuel Wenn Sie * verwenden, stimmt der Regex mit null oder mehr Leerzeichen überein, und Sie erhalten ein Leerzeichen zwischen jedem Zeichen und ein Leerzeichen an jedem Ende jeder Zeile. Wenn Sie nicht das Flag -E haben, möchten Sie `sed" s / [[: space:]] \ + / / "", um ein oder mehrere Leerzeichen zu finden. jbo5112 vor 8 Jahren 4
FWIW, NetBSDs sed unterstützt auch das `-E`-Flag. mcandre vor 6 Jahren 1
@BradKoch Die Tatsache, dass `-E nicht dem Standard entspricht, bedeutet nicht, dass GNU sed diese Option nicht hat. Das verknüpfte Dokument gibt die Verfügbarkeit der Option "-E" für GNU sed genau an. xuhdev vor 6 Jahren 0
@xuhdev Sie haben Recht, GNU sed hat in Version 4.3, die 2017 veröffentlicht wurde, Unterstützung für `-E` hinzugefügt. Ältere Versionen schlagen immer noch mit` -E` fehl. Brad Koch vor 6 Jahren 0
@BradKoch OK, ich glaube ich weiß was verwirrend ist. Ältere Versionen unterstützen bereits '-E', sind aber nicht dokumentiert. Es wurde später dokumentiert, da es scheint, dass "-E" zum POSIX-Standard kommt. Siehe https://unix.stackexchange.com/a/310454/38242 xuhdev vor 6 Jahren 0
13
Marnix A. van Ammers

Some older versions of sed may not recognize \s as a white space matching token. In that case you can match a sequence of one or more spaces and tabs with '[XZ][XZ]*' where X is a space and Z is a tab.

Für das spezielle Bedürfnis hier, mit einem älteren sed, könnten Sie Folgendes tun: $ sed's / [XZ] [XZ] [XZ] [XZ] * / / 'Eingabedatei, wobei X ein Tabulator und Z ein Leerzeichen ist. Marnix A. van Ammers vor 14 Jahren 1
8
Zac
sed 's/[ \t]*/"space or tab"/' 
Funktioniert dies garantiert für jede Version von `sed` auf einem beliebigen System? Wenn nicht, wäre es erwähnenswert, wo dies auf ähnliche Weise funktioniert wie die anderen Antworten, nur damit wir die Einschränkungen kennen und wo dies möglicherweise nicht das gewünschte Ergebnis hat. Mokubai vor 9 Jahren 2
Dieses RE ist das, was ich für den Abgleich mit Whitespace verwende. Es ist einfacher als Zeichenklassen, nur um Tabulatoren oder Leerzeichen abzugleichen. Es werden nur die grundlegendsten Konventionen regulärer Ausdrücke verwendet. Daher sollte es bei einer funktionalen Implementierung regulärer Ausdrücke überall funktionieren. Nate vor 9 Jahren 2
Auf Mac 10.9.5 stimmt dies mit Leerzeichen und 't' überein. Ich habe Michael Doumas oben für Whitespace-Zeichen verwendet (es funktioniert auch mit -e). Alien Life Form vor 8 Jahren 3
Funktioniert auf meinem SUSE-System nicht sinnvoll. Es stimmt mit der ersten Stelle in der Zeile überein, an der sich null oder mehr Leerzeichen befinden, also vor dem ersten Zeichen. Ich bezweifle, dass dies die beabsichtigte Funktion ist und sicherlich nicht der gewünschte Anwendungsfall war. Ich glaube, Sie möchten das '*' für '\ +' (oder '\ ' je Frage) ändern und möglicherweise am Ende des sed-Befehls ein ag setzen, um alle Vorkommen des Musters abzugleichen. Das Ersetzen von [\ t] durch [[: Leerzeichen:]] kann ebenfalls wünschenswert sein, falls in der Zeile etwas anderes für Leerzeichen steht. jbo5112 vor 8 Jahren 0