Verwenden sed -e "s/[[:space:]]\+/ /g"
Hier ist eine Erklärung:
[ # start of character class
[:space:] # The POSIX character class for whitespace characters. It's
# functionally identical to [ \t\r\n\v\f] which matches a space,
# tab, carriage return, newline, vertical tab, or form feed. See
# https://en.wikipedia.org/wiki/Regular_expression#POSIX_character_classes
] # end of character class
\+ # one or more of the previous item (anything matched in the brackets).
Als Ersatz möchten Sie nur ein Leerzeichen einfügen. [:space:]
funktioniert dort nicht, da dies eine Abkürzung für eine Zeichenklasse ist und die Regex-Engine nicht weiß, welches Zeichen sie dort ablegen soll.
Das +
muss in der Regex maskiert werden, da die Regex-Engine von sed +
ein normales Zeichen ist, wohingegen \+
es ein Metazeichen für 'ein oder mehrere' ist. Auf Seite 86 von " Beherrschen regulärer Ausdrücke" erwähnt Jeffrey Friedl in einer Fußnote, dass ed und grep geschützte Klammern verwendeten, weil "Ken Thompson der Ansicht war, dass reguläre Ausdrücke verwendet würden, um hauptsächlich mit C-Code zu arbeiten . " Ich gehe davon aus, dass er das Pluszeichen genauso empfand, daher die Notwendigkeit, es zu umgehen, um es als Metazeichen zu verwenden. Es ist leicht, sich davon auszulösen.
In sed Sie fliehen müssen +
, ?
, |
, (
, und )
. oder verwende -r, um einen erweiterten regulären Ausdruck zu verwenden (dann sieht es aus wie sed -r -e "s/[[:space:]]\+/ /g"
odersed -re "s/[[:space:]]\+/ /g"