GNU/Linux >> Tutoriales Linux >  >> Linux

sed reemplaza todas las pestañas y espacios con un solo espacio

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.


Linux
  1. Usando grep y sed para encontrar y reemplazar una cadena

  2. Buscar y reemplazar con sed en directorios y subdirectorios

  3. ¿Cómo reemplazo las comillas simples con otro carácter en sed?

  4. ¿Cómo reemplazar recursivamente los caracteres con sed?

  5. AWK y nombres de archivo con espacio en él.

Manipulación de texto con sed y grep

Convierta pestañas en espacios en la terminal de Linux con el comando Expandir

Cómo usar Sed para buscar y reemplazar una cadena en un archivo

Buscar y reemplazar en secuencias de comandos de shell

línea de inserción sed con espacios a una línea específica

¿Cómo cambiar el nombre de todos los archivos con caracteres especiales y espacios en un directorio?