Come rimuovo le nuove righe da un file di testo?


116

Ho i seguenti dati e ho bisogno di metterli tutti in una riga.

Ho questo:

22791

;

14336

;

22821

;

34653

;

21491

;

25522

;

33238

;

Ho bisogno di questo:

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

MODIFICARE

Nessuno di questi comandi funziona perfettamente.

La maggior parte di loro lascia che i dati abbiano questo aspetto:

22791

;14336

;22821

;34653

;21491

;25522

15
Copia e incolla nella barra degli indirizzi del browser o in un altro campo di testo. Quick'n'dirty ma funziona per piccole quantità di dati.
ignis

Risposte:


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

Modificare:

Se nessuno dei comandi pubblicati qui funziona, allora hai qualcosa di diverso da una nuova riga che separa i tuoi campi. È possibile che nel file siano presenti terminazioni di riga DOS / Windows (anche se mi aspetto che le soluzioni Perl funzionino anche in quel caso)?

Provare:

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

Se ciò non funziona, dovrai ispezionare il tuo file più da vicino (ad esempio in un editor esadecimale) per scoprire quali caratteri ci sono effettivamente che desideri rimuovere.


7
Come scrivi questo output nello stesso o in un altro file?
Goldname

3
Penso che trnon sia adatto a righe vuote. Cosa ne pensi? - - Penso che sedsia l'opzione migliore come descritto qui stackoverflow.com/q/16414410/54964
Léo Léopold Hertz 준영

Per instradare l'output su un altro file è sufficiente utilizzare il reindirizzamento dell'output. Per indirizzarlo allo stesso file, indirizzarlo a "sponge" (disponibile nel pacchetto "moreutils" sui sistemi di base Debian).
plugwash il

Per scrivere l'uscita per lo stesso file, utilizzare una subshellecho -n $(tr -d "\n" < yourfile.txt) > yourfile.txt
andpei

11
perl -p -i -e 's/\R//g;' filename

Devo fare il lavoro.


Campi da golf aperl -pie 's/\R//g' filename
Trenton,

9
paste -sd "" file.txt

1
Su Solaris (10) paste -sd ""non funziona su STDIN per impostazione predefinita, quindi se stai (some command) | paste -sd "" -
collegando

Questo non funziona se vuoi rimuovere anche la nuova riga finale . Rimuove solo le nuove righe intermedie.
Josch

Questo non ha funzionato su Mac OS, la versione di Sundeep sì. paste -sd'\0' -
Trenton

7
tr -d '\n' < file.txt

O

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

O

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

Questa pagina qui ha un sacco di altri metodi per rimuovere le nuove righe.

modificato per rimuovere l'abuso felino :)


4

uso

head -n 1 filename | od -c 

per capire QUAL è il personaggio offensivo. quindi utilizzare

tr -d '\n' <filename

per LF

tr -d '\r\n' <filename

per CRLF



2

Utilizzando 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

Fatto nerd: usa invece ASCII.

tr -d '\012' < filename.extension   

(Modificato perché non ho visto la dannata risposta che aveva la stessa soluzione, l'unica differenza era che il mio aveva ASCII)


2

Usa sed con le classi POSIX

Questo rimuoverà tutte le righe che contengono solo spazi (spazi e tabulazioni)

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

Prendi quello con cui stai lavorando e collegalo a quello

Esempio

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


sed -i '/ ^ [[: space:]] * $ / d' nomefile ... per la modifica sul posto; la risposta come sopra verrà visualizzata sullo schermo
BradChesney79

1
$ perl -0777 -pe 's / \ n + // g' input> output
$ perl -0777 -pe 'tr / \ n // d' input> output

1

Se i dati sono in file.txt, allora:

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

Il " $(<file.txt)" legge il file e fornisce il contenuto come una serie di parole che "echeggia" quindi echeggia con uno spazio tra di loro. Il comando "tr" elimina quindi eventuali spazi:

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

Funziona fintanto che l'input non è troppo grande e fintanto che stai usando Bash (etichettato per Bash, quindi va bene). Se tr -d '\n' < file.txtstessi scrivendo la risposta ora, sarebbe , che è ciò che fa la risposta accettata (e sono sorpreso di non averla scritta in quel momento). Probabilmente è stato scritto solo per mostrare "un altro modo per farlo".
Jonathan Leffler

1

xargs consuma anche le nuove righe (ma aggiunge una nuova riga finale finale):

xargs < file.txt | tr -d ' '

1

Supponendo che tu voglia mantenere solo le cifre e il punto e virgola, quanto segue dovrebbe funzionare assumendo che non ci siano problemi di codifica importanti, sebbene rimuoverà anche l'ultima "nuova riga":

$ tr -cd ";0-9"

Puoi facilmente modificare quanto sopra per includere altri caratteri, ad esempio se desideri mantenere punti decimali, virgole, ecc.


1

Utilizzo dell'editor di testo gedit (3.18.3)

  1. Fare clic su Cerca
  2. Fare clic su Trova e sostituisci ...
  3. Entra \n\snel campo Trova
  4. Lascia vuoto Sostituisci con (niente)
  5. Seleziona la casella Espressione regolare
  6. Fare clic sul pulsante Trova

Nota: questo non risolve esattamente il problema originale di 7 anni dell'OP, ma dovrebbe aiutare alcuni utenti Linux noob (come me) che trovano la loro strada qui dagli SE con simili domande "come faccio a ottenere il mio testo tutto su una riga" .


1

Oggi stavo avendo lo stesso caso, super facile in vim o nvim, che puoi usare gJper unire le linee. Per il tuo caso d'uso, fallo e basta

99gJ

questo unirà tutte le tue 99 linee. È possibile regolare il numero 99in base alle esigenze in base a quante linee unire. Se unisci solo 1 riga, allora solo gJè sufficiente.


0

Lo farei con awk, ad es

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

(uno svantaggio è che a è "accumulato" in memoria).

MODIFICARE

Hai dimenticato printf! Quindi anche

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

o probabilmente meglio, quello che era già stato dato negli altri ans usando awk.


0

Di solito ottengo questo caso d'uso quando copio uno snippet di codice da un file e voglio incollarlo in una console senza aggiungere nuove righe non necessarie, ho finito per fare un alias bash
(l'ho chiamato onelinese sei curioso)

xsel -b -o | tr -d '\n' | tr -s ' ' | xsel -b -i
  • xsel -b -o legge i miei appunti

  • tr -d '\n' rimuove le nuove righe

  • tr -s ' ' rimuove gli spazi ricorrenti

  • xsel -b -i lo rimette nei miei appunti

dopodiché avrei incollato il nuovo contenuto degli appunti in linea in una console o qualsiasi altra cosa.


0

Ti manca la risposta più ovvia e veloce soprattutto quando devi farlo nella GUI per correggere qualche strano ritorno a capo automatico.

  • Aperto gedit

  • Quindi Ctrl+ H, quindi inserisci la Findcasella di testo \ne in Replace withuno spazio vuoto, quindi riempi la casella di controllo Regular expressione voilà.


0

Per rimuovere anche la nuova riga finale alla fine del file

python -c "s=open('filename','r').read();open('filename', 'w').write(s.replace('\n',''))"
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.