Ersetzen Sie alle Vorkommen von zwei Leerzeichen nach dem Ende eines Satzes durch nur ein Leerzeichen

9

Ich bin festgefahren, reguläre Ausdrücke mit einem sed-Befehl einzuschließen.

F: Ich möchte alle Vorkommen von zwei Leerzeichen nach dem Ende eines Satzes durch nur ein Leerzeichen ersetzen .

Folgendes habe ich getan:

sed 's/^ $/^$/' file  

Und es hat nicht zwei Leerzeichen durch ein Leerzeichen nach dem Ende des Satzes ersetzt.

Ausgabe bekomme ich:

This is the output.  Hello Hello

Ausgabe, die ich möchte:

This is the output. Hello Hello
Zeus
quelle
@ Rahul Ich möchte, dass die Ausgabe, die einmal Leerzeichen enthält, nachdem der Satz endet. Nicht zwei Leerzeichen wie im ersten Satz. Ich möchte den zweiten Satz ausgeben
Zeus
Die Antwort von @Jasen ist richtig. Übrigens bedeutet der Befehl, den Sie ausprobiert haben: Ersetzen Sie eine Zeile, die nur aus einem einzelnen Leerzeichen besteht, durch eine leere Zeile. Deshalb hat es nicht getan, was Sie wollten.
Rexkogitans
1
Hier
einfügen
@gerrit Dieser Krieg wurde vor etwa 20 Jahren verloren. ;)
h4ckNinja

Antworten:

12
 sed 's/\.   */. /g' < file

Ersetzen Sie den Punkt gefolgt von zwei oder mehr Leerzeichen durch einen Punkt, gefolgt von einem einzelnen Leerzeichen.

Jasen
quelle
Ihr Befehl funktioniert tatsächlich für den gesamten Absatz. Genau das wollte ich. Vielen Dank!
Zeus
oder sed -r 's/\.\s+/. /g' filemit GNU sed ...
Sundeep
@spasic verwenden sed -Eeher als sed -r. Das funktioniert mit GNU sed und * BSD sed (inkl. Mac OS X) und einigen anderen. Es ist geplant, "sehr bald" standardmäßig in POSIX aufgenommen zu werden.
Cas
@cas Ich erinnere mich, dass ich vor einiger Zeit sed -Ejemandem auf dieser Site vorgeschlagen habe, der nicht funktioniert hat, aber sed -rfunktioniert hat. Ich habe mit GNU sed alleine gearbeitet, daher keine Ahnung von POSIX und anderen Variationen. Ich werde versuchen, dieses Detail in Zukunft aufzunehmen , danke :)
Sundeep
Es muss eine alte Version von GNU sed gewesen sein. Sie haben -Eseit einiger Zeit unterstützt (seit mindestens 2011, aber die Mann- und Infoseiten erwähnen immer noch nur -r)
cas
13

Ihr sedBefehl 's/^ $/^$/'wird nicht tun, was Sie wollen. Es werden nur alle Zeilen ersetzt, die ein Leerzeichen enthalten, durch ein Zeilen enthalten ^$.

Abhängig davon, welche Zeichen das Ende des Satzes markieren, können Sie Folgendes tun:

sed -e 's/\([.?!]\) \{2,\}/\1 /g' <file

Dies wird ersetzen 2 oder mehr Räume nach ., ?oder !mit einem Raum nur.

cuonglm
quelle
1
kann verkürzt werden aufsed -r 's/([.?!])\s+/\1 /g' file
Sundeep
Vielen Dank. Aber würden Sie bitte näher erläutern, warum Sie so viele runde, eckige Klammern verwendet haben? Es ist wenig verwirrend.
Zeus
1
@spasic: Das funktioniert nur mit GNU sed, aktualisiert mit vereinfachter Version.
Cuonglm
@Zeus: Das ist Standardsyntax mit Standard-BRE.
Cuonglm
1
Nein, das ursprüngliche sedBearbeitungsskript ersetzt jede Zeile, die ein einzelnes Leerzeichen enthält, durch die Literalzeichenfolge ^$.
Kusalananda
7

Dies ist, was Sie suchen könnten,

tr -s " " <filename

Stichprobe,

$ echo "This is the output.  Hello Hello" | tr -s "[:blank:]"
This is the output. Hello Hello

Verwenden von sed,

$ echo "This is the output.  Hello Hello" | sed 's/\. \+/. /g'
$ echo "This is the output.  Hello Hello" | sed 's/\. \{1,\}/. /g'
This is the output. Hello Hello
Rahul
quelle
2
Nun, es funktioniert dank, aber ich muss den Befehl sed einfügen. Bitte erzählen Sie etwas Ähnliches wie oben gezeigt, wie Ersetzen, Ändern von Text usw. in sed.
Zeus
2
Ich war mir dieser Funktion nicht bewusst,
Jasen
3
Dieser Ansatz ersetzt zwei Leerzeichen, die ebenfalls nicht das Ende des Satzes sind.
Cuonglm