Como substituir vários espaços por uma guia

21

Eu tenho alguns arquivos de texto que contêm algumas colunas separadas por um número variado de espaços, mas eu preciso de uma única guia como um separador. É possível fazer no Bash?

    
por user_unknown 02.02.2011 / 23:26

7 respostas

24

Para converter sequências de mais de um espaço em uma guia, mas deixe espaços individuais sozinhos :

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

Para fazer isso com vários arquivos:

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

ou

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

ou

find . -type f -exec sed -i .bak 's/ \+ /\t/g' {} \;
    
por 03.02.2011 / 00:32
4

Você pode usar sed para substituir vários espaços por uma guia.

Exemplo para substituir um ou mais espaços por uma guia:

cat spaced-file | sed 's/ \+/\t/g' > tabbed-file
    
por 02.02.2011 / 23:31
4

Se o seu personagem tiver várias guias, você também pode usar tr -s :

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

Por exemplo:

my_file.txt | tr -s " "

Todos os espaços em branco se tornarão um.

    
por 23.05.2016 / 17:44
3

A resposta mais fácil usando apenas bash é:

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

Se houver um número variável de colunas, você poderá fazer isso, mas isso só funcionará em bash , não sh :

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

por exemplo,

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

produz:

a   b   c
d   e   f
g   h   i

(existe um separador entre cada um, mas é difícil ver quando o colo aqui)

Você também pode fazer isso usando sed ou tr , mas observe que o tratamento de espaços em branco no início produz 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
    
por 02.02.2011 / 23:30
2

perl -p -i -e 's/\s+/\t/g' *.txt

    
por 02.02.2011 / 23:41
2

Experimente o seguinte script SED:

 sed 's/  */<TAB>/g' <spaces-file > tabs-file

Onde < TAB > está pressionando a tecla TAB.

    
por 02.02.2011 / 23:44
-1

Esta é uma solução muito simples:

    sed -E 's/\s+/\t/g' your_file > new_file

sed basicamente funciona dessa maneira (sed 's / old_pattern / new_pattern / g'). Neste caso, o padrão antigo é "\ s +", o que significa encontrar espaço "s" um ou mais tempo "+" e a barra invertida "\" para interpretá-lo como expressão regular.
O novo padrão é a aba "\ t", que é escrita em formato de expressão regular e o "g" é aplicado a substituição a todas as linhas "globalmente".

    
por 01.04.2016 / 15:01