Como eu removo novas linhas de um arquivo de texto?

116

Tenho os seguintes dados e preciso colocá-los em uma única linha.

Eu tenho isto:

22791

;

14336

;

22821

;

34653

;

21491

;

25522

;

33238

;

Eu preciso disso:

22791;14336;22821;34653;21491;25522;33238;

EDITAR

Nenhum desses comandos está funcionando perfeitamente.

A maioria deles permite que os dados tenham a seguinte aparência:

22791

;14336

;22821

;34653

;21491

;25522
Alucard
fonte
15
Copie e cole na barra de endereço do navegador ou em outro campo de texto. Rápido e sujo, mas funciona para pequenas quantidades de dados.
ignis de

Respostas:

245
tr -d '\n' < yourfile.txt

Editar:

Se nenhum dos comandos postados aqui estiver funcionando, você tem algo diferente de uma nova linha separando seus campos. Possivelmente você tem terminações de linha DOS / Windows no arquivo (embora eu espere que as soluções Perl funcionem mesmo nesse caso)?

Experimentar:

tr -d "\n\r" < yourfile.txt

Se isso não funcionar, você terá que inspecionar seu arquivo mais de perto (por exemplo, em um editor hexadecimal) para descobrir quais caracteres estão realmente lá que você deseja remover.

Tyler McHenry
fonte
7
Como você grava esta saída no mesmo ou em outro arquivo?
StackOverflowOfficial
3
Eu acho que trnão é adequado para linhas vazias. O que você acha? - - Acho que sedé a melhor opção
conforme
Para rotear a saída para outro arquivo, basta usar o redirecionamento de saída. Para encaminhá-lo para o mesmo arquivo, canalize-o para "sponge" (disponível no pacote "moreutils" nos sistemas básicos do Debian).
plugwash de
Para gravar a saída no mesmo arquivo, use um subshellecho -n $(tr -d "\n" < yourfile.txt) > yourfile.txt
andpei
11
perl -p -i -e 's/\R//g;' filename

Deve fazer o trabalho.

ZyX
fonte
Golfe paraperl -pie 's/\R//g' filename
Trenton
9
paste -sd "" file.txt
Amardeep AC9MF
fonte
1
No Solaris (10) paste -sd ""não funciona em STDIN por padrão, então, se você estiver (some command) | paste -sd "" -
acessando
Isso não funciona se você também deseja remover a nova linha final . Ele remove apenas novas linhas intermediárias.
Josch 01 de
Isso não funcionou no Mac OS, a versão de Sundeep sim. paste -sd'\0' -
Trenton
7
tr -d '\n' < file.txt

Ou

awk '{ printf "%s", $0 }' file.txt

Ou

sed ':a;N;$!ba;s/\n//g' file.txt

Esta página aqui tem vários outros métodos para remover novas linhas.

editado para remover o abuso felino :)

Vivin Paliath
fonte
4

usar

head -n 1 filename | od -c 

para descobrir QUAL é o personagem ofensivo. então use

tr -d '\n' <filename

para LF

tr -d '\r\n' <filename

para CRLF

MrE
fonte
4

Você pode editar o arquivo no vim:

$ vim inputfile
:%s/\n//g
loganaayahee
fonte
2
e para substituir com espaços::%s/\n/ /g
Remi Mélisson
2

Usando man 1 ed:

# cf. http://wiki.bash-hackers.org/doku.php?id=howto:edit-ed 
ed -s file <<< $'1,$j\n,p'  # print to stdout 
ed -s file <<< $'1,$j\nwq'  # in-place edit
Carlmund
fonte
2

Fato do nerd: use ASCII.

tr -d '\012' < filename.extension   

(Editado porque não vi a maldita resposta que tinha a mesma solução, a única diferença era que a minha tinha ASCII)

Byfjunarn
fonte
2

Use sed com classes POSIX

Isso removerá todas as linhas que contêm apenas espaços em branco (espaços e tabulações)

sed '/^[[:space:]]*$/d'

Basta pegar o que você está trabalhando e canalizar para aquele

Exemplo

cat filename | sed '/^[[:space:]]*$/d'

jasonleonhard
fonte
sed -i '/ ^ [[: espaço:]] * $ / d' nome do arquivo ... para edição no local; a resposta conforme acima será exibida na tela
BradChesney79
1
$ perl -0777 -pe 's / \ n + // g' input> output
$ perl -0777 -pe 'tr / \ n // d' entrada> saída
Greg Bacon
fonte
1

Se os dados estiverem em arquivo.txt, então:

echo $(<file.txt) | tr -d ' '

O ' $(<file.txt)' lê o arquivo e fornece o conteúdo como uma série de palavras que 'ecoam' em seguida com um espaço entre elas. O comando 'tr' então exclui todos os espaços:

22791;14336;22821;34653;21491;25522;33238;
Jonathan Leffler
fonte
Isso funciona contanto que a entrada não seja muito grande e contanto que você esteja usando Bash (marcado para Bash, então está tudo OK). Se eu estivesse escrevendo a resposta agora, seria tr -d '\n' < file.txt, que é o que a resposta aceita (e estou surpreso por não ter escrito na época). Isso provavelmente foi escrito apenas para mostrar "mais uma maneira de fazer isso".
Jonathan Leffler,
1

xargs consome novas linhas também (mas adiciona uma nova linha final):

xargs < file.txt | tr -d ' '
marky
fonte
1

Supondo que você deseja manter apenas os dígitos e os pontos-e-vírgulas, o procedimento a seguir deve funcionar, presumindo que não há problemas de codificação importantes, embora também remova a última "nova linha":

$ tr -cd ";0-9"

Você pode facilmente modificar o acima para incluir outros caracteres, por exemplo, se quiser reter pontos decimais, vírgulas, etc.

pico
fonte
1

Usando o editor de texto gedit (3.18.3)

  1. Clique em Pesquisar
  2. Clique em Localizar e substituir ...
  3. Entre \n\sno campo Encontrar
  4. Deixe Substituir com em branco (nada)
  5. Verifique a expressão regular caixa
  6. Clique no botão Encontrar

Observação: isso não resolve exatamente o problema original do OP de 7 anos, mas deve ajudar alguns usuários de Linux noob (como eu) que encontram seu caminho aqui desde os SEs com perguntas semelhantes "como faço para colocar meu texto em uma linha" .

Hastig Zusammenstellen
fonte
1

Estava tendo o mesmo caso hoje, super fácil no vim ou nvim, você pode usar gJpara juntar linhas. Para seu caso de uso, basta fazer

99gJ

isso irá juntar todas as suas 99 linhas. Você pode ajustar o número 99conforme necessário de acordo com quantas linhas juntar. Se apenas juntar 1 linha, então só gJé bom o suficiente.

LeOn - Han Li
fonte
0

Eu faria isso com awk, por exemplo

awk '/[0-9]+/ { a = a $0 ";" } END { print a }' file.txt

(uma desvantagem é que a é "acumulado" na memória).

EDITAR

Esqueci o printf! Assim também

awk '/[0-9]+/ { printf "%s;", $0 }' file.txt

ou melhor, o que já foi dado nos outros ans usando awk.

ShinTakezou
fonte
0

Normalmente recebo este caso de uso quando estou copiando um trecho de código de um arquivo e quero colá-lo em um console sem adicionar novas linhas desnecessárias, acabei criando um alias de bash
(chamei onelinese você estiver curioso)

xsel -b -o | tr -d '\n' | tr -s ' ' | xsel -b -i
  • xsel -b -o lê minha prancheta

  • tr -d '\n' remove novas linhas

  • tr -s ' ' remove espaços recorrentes

  • xsel -b -i empurra isso de volta para a minha prancheta

depois disso, eu colaria o novo conteúdo da área de transferência on-line em um console ou qualquer outra coisa.

Mohammad AbuShady
fonte
0

Você está perdendo a resposta mais óbvia e rápida, especialmente quando você precisa fazer isso na GUI para consertar alguma quebra de linha estranha.

  • Abrir gedit

  • Em seguida, Ctrl+ H, em seguida, coloque na Findcaixa de texto \ne em Replace withum espaço vazio e preencha a caixa de seleção Regular expressione voila.

Eduard Florinescu
fonte
0

Para remover também a nova linha final no final do arquivo

python -c "s=open('filename','r').read();open('filename', 'w').write(s.replace('\n',''))"
crizCraig
fonte