Usar sed -e "s/[[:space:]]\+/ /g"
Aqui está uma explicação:
[ # 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).
Para sua substituição, você deseja inserir apenas um espaço. [:space:]
não funcionará lá, pois é uma abreviação para uma classe de personagem e o mecanismo de expressão regular não saberia qual caractere colocar lá.
O +
escape deve ser escapado no regex porque, com o mecanismo de regex do sed, +
é um caractere normal, enquanto \+
é um metacaractere de 'um ou mais'. Na página 86 de Mastering Regular Expressions , Jeffrey Friedl menciona em uma nota de rodapé que ed e grep usavam parênteses escapados porque "Ken Thompson achou que expressões regulares seriam usadas para trabalhar principalmente com código C, onde a necessidade de combinar parênteses brutos seria mais comum do que a referência remota. . " Suponho que ele se sentiu da mesma maneira com o sinal de mais, daí a necessidade de escapar dele para usá-lo como um metacaractere. É fácil ser enganado por isso.
Em sed você precisa escapar +
, ?
, |
, (
, e )
. ou use -r para usar regex estendido (então parece sed -r -e "s/[[:space:]]\+/ /g"
oused -re "s/[[:space:]]\+/ /g"