Entfernen Sie Leerzeichen vor bestimmten Zeichen

Entfernen Sie Leerzeichen vor bestimmten Zeichen

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 sedfolgendem 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.

verwandte Informationen