Como substituir espaços por novas linhas / inserir em um arquivo de texto?

18

Eu tenho um arquivo de texto simples chamado "exemplo".

Lendo com o comando terminal: cat example

Resultado:

abc cdef ghi jk lmnopq rst uv wxyz

Desejo converter (transformar) no seguinte formato: (saída esperada de cat example)

abc
cdef
ghi
jk
lmnopq
rst
uv
wxyz

Como posso fazer isso através da linha de comando?

(Este é apenas um arquivo de exemplo, desejo converter a posição da palavra na coluna vertical)

Pandya
fonte
Relacionados: unix.stackexchange.com/q/169995/85039
Sergiy Kolodyazhnyy

Respostas:

37

Algumas escolhas:

  1. O clássico, use tr:

    tr ' ' '\n' < example
    
  2. Usar cut

    cut -d ' ' --output-delimiter=$'\n' -f 1- example
    
  3. Usar sed

    sed 's/ /\n/g' example
    
  4. Usar perl

    perl -pe 's/ /\n/g' example
    
  5. Use o shell

    foo=$(cat example); echo -e ${foo// /\\n}
    
Terdon
fonte
Para o sedexemplo, eu precisava para adicionar um $bash para chegar a substituir com uma nova linha real ou seja:sed $'s/ /\\\n/g' example
acumartini
Acima exemplo para OSX sed, para gnu-sed:sed $'s/ /\\n/g'
acumartini 09/09/19
16

Experimente o comando abaixo

awk -v RS=" " '{print}' file

OU

awk -v RS='[\n ]' '{print}' file

Exemplo:

$ awk -v RS=" " '{print}' example
abc
cdef
ghi
jk
lmnopq
rst
uv
wxyz

Explicação:

RS (Record Seperator) é uma variável awk embutida. No primeiro comando, o valor fornecido para a variável separadora de registro é espaço. O awk interrompe a impressão sempre que encontrar um espaço.

No segundo comando, o valor dado à variável RS é espaço ou um novo caractere de linha. Este comando elimina a linha em branco extra exibida durante a execução do primeiro comando.

Avinash Raj
fonte
8

Você pode usar xargs,

cat example | xargs -n 1

ou melhor

xargs -n 1 < example
souravc
fonte
6
xargs -n 1 < examplepoupa um gatinho
Rinzwind
2

Usando um perloneliner:

perl -p -i -e 's/\s/\n/g' example

Ele substituirá espaços e guias por "ENTER" (aka \n)

Sylvain Pineau
fonte
1

Ninguém postou python, então aqui está isso:

python -c "import sys;lines=['\n'.join(l.strip().split()) for l in sys.stdin.readlines()];print('\n'.join(lines))" < input.txt 

Nós redirecionamos o arquivo de entrada para pythono fluxo stdin do e lemos linha por linha. Cada linha é removida de sua nova linha à direita, dividida em palavras e depois reunida em uma sequência em que cada palavra é separada por nova linha. Isso é feito para garantir que uma palavra por linha e evitar a inserção de várias novas linhas, caso haja vários espaços ao lado de entre si. Eventualmente, terminamos com uma lista de strings, que é novamente unida em uma string maior e impressa no fluxo stdout. Que depois pode ser redirecionado para outro arquivo com > out.txt redirecionamento.

Sergiy Kolodyazhnyy
fonte
0

Semelhante ao 'tr' acima, mas com as adições:

  • Também funciona para guias

  • Converte vários espaços ou tabulações em 1 nova linha

    tr -s '[:space:]' '\n' < example
    
AstroTom
fonte