Utilizar sed -e "s/[[:space:]]\+/ /g"
Aquí hay una explicación:
[ # 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 su reemplazo, solo desea insertar un espacio. [:space:]
no funcionará allí ya que es una abreviatura para una clase de personaje y el motor de expresiones regulares no sabría qué personaje poner allí.
Se +
debe escapar en la expresión regular porque con el motor de expresión regular de sed +
es un carácter normal, mientras que \+
es un metacarácter para 'uno o más'. En la página 86 de Mastering Regular Expressions , Jeffrey Friedl menciona en una nota al pie de página que ed y grep usaron paréntesis escapados porque "Ken Thompson sintió que las expresiones regulares se usarían principalmente con el código C, donde la necesidad de unir paréntesis sin procesar sería más común que la referencia inversa ". Supongo que él sentía lo mismo por el signo más, de ahí la necesidad de escapar de él para usarlo como metacarácter. Es fácil dejarse engañar por esto.
En sed que necesita para escapar +
, ?
, |
, (
, y )
. o use -r para usar expresiones regulares extendidas (entonces parece sed -r -e "s/[[:space:]]\+/ /g"
osed -re "s/[[:space:]]\+/ /g"