Solución 1:
Usa 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 de una clase de carácter y el motor de expresiones regulares no sabría qué carácter poner allí.
El +
debe escaparse en la expresión regular porque con el motor de expresiones regulares de sed +
es un carácter normal mientras que \+
es un metacarácter para 'uno o más'. En la página 86 de Dominar las expresiones regulares , Jeffrey Friedl menciona en una nota al pie que ed y grep usaron paréntesis escapados porque "Ken Thompson sintió que las expresiones regulares se usarían para trabajar principalmente con Ccode, donde la necesidad de hacer coincidir los paréntesis sin procesar sería más común que las referencias inversas". Supongo que sintió lo mismo por el signo más, de ahí la necesidad de escapar de él para usarlo como un metacarácter. Es fácil confundirse con esto.
En sed necesitarás escapar +
, ?
, |
, (
y )
. o use -r para usar expresiones regulares extendidas (luego parece sed -r -e "s/[[:space:]]\+/ /g"
o sed -re "s/[[:space:]]\+/ /g"
Solución 2:
Puedes usar el -s
("apretar") opción de tr
:
$ tr -s '[:blank:]' <<< 'test.de. 1547 IN SOA ns1.test.de. dnsmaster.test.de. 2012090701 900 1000 6000 600'
test.de. 1547 IN SOA ns1.test.de. dnsmaster.test.de. 2012090701 900 1000 6000 600
El [:blank:]
la clase de carácter comprende espacios y tabulaciones.