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

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.


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.


Golfe paraperl -pie 's/\R//g' filename
Trenton

9
paste -sd "" file.txt

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 :)


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



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

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)


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'


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

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;

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 ' '

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.


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" .


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.


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.


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.


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.


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',''))"
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.