Cómo reemplazar múltiples espacios por una pestaña

Cómo reemplazar múltiples espacios por una pestaña

Tengo algunos archivos de texto que contienen algunas columnas separadas por varios espacios, pero en su lugar necesito una sola pestaña como separador. ¿Es posible hacerlo en Bash?

Respuesta1

Para convertir secuencias demás de un espacioa una pestaña, perodejar los espacios individuales en paz:

sed 's/ \+ /\t/g' inputfile > outputfile

Para hacer esto para varios archivos:

for inputfile in *
do
    sed 's/ \+ /\t/g' "$inputfile" > tmpfile && mv tmpfile "$inputfile"
done

o

for inputfile in *
do
    sed -i.bak 's/ \+ /\t/g' "$inputfile"
done

o

find . -type f -exec sed -i.bak 's/ \+ /\t/g' {} \;

Utilice este formulario para MacOS (o simplemente para evitar escapar +en Linux):

sed -E 's/ + /\t/g'

junto con otras opciones, etc., que necesite de los ejemplos anteriores.

Respuesta2

Si tu personaje tiene varias pestañas, también puedes usar tr -s:

-s, --squeeze-repeats   replace each input sequence of a repeated character
                        that is listed in SET1 with a single occurrence

Por ejemplo:

my_file.txt | tr -s " "

Todos los espacios en blanco se convertirán en uno.

Respuesta3

Puede utilizar sedpara reemplazar varios espacios con una tabulación:

Ejemplo para reemplazar uno o más espacios con una pestaña:

cat spaced-file | sed 's/ \+/\t/g' > tabbed-file

Respuesta4

La respuesta más fácil usando solo bashes:

while read -r col1 col2 col3 ...; do
    echo -e "$col1\t$col2\t$col3..."
done <file

Si hay un número variable de columnas, puede hacer esto, pero solo funcionará en bash, no en sh:

while read -r -a cols; do
    (
        IFS=$'\t'
        echo "${cols[*]}"
    )
done <file

p.ej

while read -r -a cols; do
    (
        IFS=$'\t'
        echo "${cols[*]}"
    )
done <<EOF
a b   c
d   e    f
  g h i
EOF

produce:

a   b   c
d   e   f
g   h   i

(hay una pestaña entre cada uno, pero es difícil verla cuando la pego aquí)

También puedes hacerlo usando sedo tr, pero observa que el manejo de los espacios en blanco al principio produce resultados diferentes.

sed:

$ sed 's/  */\t/g' << EOF
a b   c
d   e    f
  g h i
EOF
a       b       c
d       e       f
        g       h       i

tr:

$ tr -s ' ' '\t' <<EOF
a b   c
d   e    f
  g h i
EOF
a       b       c
d       e       f
        g       h       i

información relacionada