
Ich versuche, Leerzeichen aus Text wie diesem zu entfernen:
Ala ma kota ,psa i kanarka
, chyba . . .
um zu bekommen
Ala ma kota,psa i kanarka, chyba...
Ich habe es mit sed
folgendem Befehl versucht:
echo $'Ala ma kota ,psa i kanarka\n, chyba . . .' | sed 's/ ,/,/g' | sed 's/ ././g'
Es hat funktioniert, ,
aber mit Punkten oder einer neuen Zeile besteht immer noch ein Problem. Es ersetzt beides .
und nicht beide zusammen.
(Ich verwende Linux.)
Antwort1
Verwenden von GNU sed (das Sie haben, weil Sie dies mit Linux getaggt haben):
$ echo $'Ala ma kota ,psa i kanarka\n, chyba . . .' | sed -zE 's/[[:space:]]([,.?!])/\1/g'
Ala ma kota,psa i kanarka, chyba...
Wie es funktioniert
-z
Dadurch wird sed angewiesen, den gesamten Text auf einmal einzulesen, statt jeweils nur eine Zeile nach der anderen.
-E
Dies weist sed an, eine erweiterte Regex-Syntax zu verwenden. Dadurch entfällt die Notwendigkeit einiger hässlicher Backslashs.
s/[[:space:]]([,.?!])/\1/g
Dadurch werden alle Leerzeichen, auf die eines der Zeichen
,
,.
,?
, oder folgt!
, nur durch das Satzzeichen ersetzt.Wenn Sie andere Satzzeichen einfügen möchten, fügen Sie diese einfach mit dem zwischen den eckigen Klammern ein
,.?!
.[[:space:]]
umfasst nicht nur Leerzeichen, sondern auch Tabulatoren, Zeilenumbrüche usw.
Variation
Diese Version mit einemoder mehrLeerzeichen vor den Satzzeichen:
$ echo $'Ala ma kota ,psa i kanarka \n, chyba . . .' | sed -zE 's/[[:space:]]+([,.?!])/\1/g'
Ala ma kota,psa i kanarka, chyba...
Diskussion
In der Frage steht:
s/ ././g
Beachten Sie, dass in einem regulären Ausdruck .
ein Platzhalter ist: Es entspricht allem. Daher .
entspricht ein Leerzeichen gefolgt vonbeliebigZeichen. Diese beiden Zeichen werden ersetzt durch .
(da die Ersetzungsseitenichtein regulärer Ausdruck, das .
ist ein wörtlicher Punkt). Das ist nicht das, was Sie erhofft hatten.