Frage Wie passt man Whitespace in sed zusammen?


Wie kann ich Leerzeichen in sed anpassen? In meinen Daten möchte ich alle 3+ nachfolgenden Leerzeichen (Tab-Leerzeichen) abgleichen und sie durch 2 Leerzeichen ersetzen. Wie kann das gemacht werden?


185
2018-02-24 11:53


Ursprung




Antworten:


Die Zeichenklasse \s passt zu den Whitespace-Zeichen <tab> und <space>.

Beispielsweise:

$ sed -e "s/\s\{3,\}/  /g" inputFile

wird jede Folge von mindestens 3 Leerzeichen durch zwei Leerzeichen ersetzen.


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


193
2018-02-24 12:08



Aha! Es war der fehlende Schalter, der mich erwischte. - sequoia mcdowell
Ich musste auch den '-r'-Schalter hinzufügen, der es erweiterten Regex ermöglicht, sed' \ s 'als Leerzeichen zu erkennen. - HUB
Mit Apples sed Ich musste es benutzen [[:space:]] weil \s hat nicht für mich gearbeitet. Vielleicht \s ist ein GNU sed Erweiterung? - Jared Beck
@JaredBeck danke, war aus Ideen, warum meine einfache Regex nicht funktioniert .. Dies ist lahm, ich dachte, es war Standard erweiterte Regex .. Auch-r nicht funktioniert und -E hat Kniebeugen - Karthik T
Danke für die Rückmeldung. Ich habe die Antwort mit Links zum POSIX-Standard aktualisiert. - mrucci


Dies funktioniert auf MacOS 10.8:

sed -E "s/[[:space:]]+/ /g"

55
2017-08-28 20:28



Weißt du, ob das auf allen Linux-Distributionen funktioniert? - amphibient
Nicht allgemein, GNU sed wird nicht -E. Auf der BSD sed man-Seite: "Die Optionen -E, -a und -i sind nicht-standardmäßige FreeBSD-Erweiterungen und möglicherweise nicht auf anderen Betriebssystemen verfügbar." - Brad Koch
Warum brauchst du das -E Flag für den + Operator? Die meisten Ausdrücke würden wahrscheinlich mit * in Ordnung sein, dann würde das auf anderen Plattformen funktionieren. - Samuel
@Samuel Wenn Sie * verwenden, wird die Regex mit null oder mehr Leerzeichen übereinstimmen, und Sie erhalten ein Leerzeichen zwischen jedem Zeichen und ein Leerzeichen an jedem Ende jeder Zeile. Wenn Sie nicht die -E-Flagge haben, dann wollen Sie sed "s/[[:space:]]\+/ /g" um einem oder mehreren Räumen zu entsprechen. - jbo5112
FWIW, NetBSD sed unterstützt die -E Flagge auch. - mcandre


Einige ältere sed-Versionen erkennen \ s möglicherweise nicht als Token, das mit einem weißen Leerzeichen übereinstimmt. In diesem Fall können Sie eine Folge von einem oder mehreren Leerzeichen und Tabulatoren mit '[XZ] [XZ] *' abgleichen, wobei X ein Leerzeichen und Z ein Tab ist.


13
2018-04-07 15:12



Also für die besondere Notwendigkeit hier, mit einem älteren sed, könnten Sie tun: $ sed 's / [XZ] [XZ] [XZ] [XZ] * / / g' Eingabedatei, wo X ist ein Tab und Z ist ein Leerzeichen. - Marnix A. van Ammers


sed 's/[ \t]*/"space or tab"/'

8
2017-07-22 14:52



Funktioniert das garantiert auf jeder Version von sed auf irgendeinem System? Wenn nicht, dann wäre es vielleicht erwähnenswert, wo dies in ähnlicher Weise funktioniert wie die anderen Antworten, nur damit wir die Grenzen kennen und wo dies nicht das beabsichtigte Ergebnis haben könnte. - Mokubai♦
Dieses RE ist, was ich verwende, um Whitespace zu entsprechen. Es ist einfacher als Zeichenklassen, nur um Tab oder Leerzeichen zu entsprechen. Es verwendet nur die grundlegendsten Konventionen von regulären Ausdrücken, daher sollte es überall mit einer funktionalen Implementierung von regulären Ausdrücken funktionieren. - Nate
Auf Mac 10.9.5 entspricht das für Leerzeichen und 't'. Ich benutzte Michael Doumas oben, um Leerzeichen zu vergleichen (es funktioniert auch mit -e). - Alien Life Form
Funktioniert nicht sinnvoll auf meinem SUSE-System. Es stimmt mit der ersten Stelle in der Zeile überein, in der null oder mehr Leerzeichen vor dem ersten Zeichen stehen. Ich bezweifle, dass das die beabsichtigte Funktion ist und sicherlich nicht der gewünschte Anwendungsfall. Ich glaube, du willst das '*' für '\ +' (oder '\ {3, \}' für die Frage) ändern und vielleicht ein g am Ende des sed-Befehls setzen, um allen Vorkommen des Musters zu entsprechen. Das Ersetzen von [\ t] durch [[: space:]] kann ebenfalls wünschenswert sein, falls etwas anderes für Leerzeichen in der Zeile vorhanden ist. - jbo5112