Posługiwać się sed -e "s/[[:space:]]\+/ /g"
Oto wyjaśnienie:
[ # 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).
W celu wymiany chcesz wstawić tylko spację. [:space:]
nie będzie tam działał, ponieważ jest to skrót od klasy postaci, a silnik regex nie wiedziałby, jaką postać tam umieścić.
+
Musi być uciekł w regex ponieważ z SED regex silnika +
jest normalną postać natomiast \+
jest Metaznak dla „jednej lub więcej”. Na stronie 86 Mastering Regular Expressions Jeffrey Friedl wspomina w przypisie, że ed i grep używają nawiasów ucieczkowych, ponieważ „Ken Thompson uważał, że wyrażenia regularne będą używane głównie do pracy z kodem C, gdzie potrzeba dopasowania surowych nawiasów byłaby bardziej powszechna niż odwracanie . ” Zakładam, że tak samo czuł się ze znakiem plus, stąd potrzeba ucieczki przed nim, aby użyć go jako metaznaku. Łatwo się o to potknąć.
W sed musisz uciec +
, ?
, |
, (
, i )
. lub użyj -r, aby użyć rozszerzonego wyrażenia regularnego (wtedy wygląda jak sed -r -e "s/[[:space:]]\+/ /g"
lubsed -re "s/[[:space:]]\+/ /g"