Come posso stampare output su più righe sulla stessa riga?


Risposte:


13

Puoi rimuovere tutte le ricorrenze di personaggi da un determinato set con tr -d. Per rimuovere il carattere di nuova riga utilizzare:

tr -d '\n'

Come sempre è possibile utilizzare il reindirizzamento di input e output e pipe per leggere o scrivere su file e altri processi.

Se vuoi mantenere l'ultima riga nuova puoi semplicemente aggiungerla di nuovo con echoo printf '\n', ad esempio:

cat file1 file2... | { tr -d '\n'; echo; } > output.txt

10

Molti modi. Per illustrare, ho salvato il tuo esempio in file:

$ cat file | tr -d '\n'
abcdefqwerty$ 
$ cat file | perl -pe 's/\n//'
abcdefqwerty$ 

Ciò rimuove tutti i caratteri di nuova riga, incluso l'ultimo però. Potresti invece voler fare:

$ printf "%s\n" "$(cat file | perl -pe 's/\n//')"
abcdefqwerty
$ printf "%s\n" "$(cat file | tr -d '\n')"
abcdefqwerty

Penso che la combinazione printf+ cat+ perlsia gestita molto meglio tramite il perl -pe 's/\n//;END{printf "\n"}' input.txt processo singolo, nessuna sostituzione di comando e pasticciare con le virgolette e nessun UUOC. Forse.
Sergiy Kolodyazhnyy,



2

Se vuoi usare Perl per questo, puoi usare la sua chompfunzione:

perl -pe chomp

Qualche dettaglio in più, per chi è interessato.

Puoi passare uno o più nomi di file come argomenti successivi.

perl -pe chomp file1 file2 file3

In alcuni casi potresti non volerlo fare , ma puoi invece reindirizzare o reindirizzare a quel comando. (Queste abilità - e quell'avvertimento - si applicano anche a qualsiasi altra soluzione perl -po perl -nbasata.)

Quindi, se si desidera elaborare l'output in esecuzione some-command:

some-command | perl -pe chomp

Questo è potenzialmente più veloce del comando Perl nella risposta di terdon . I caratteri Newline (rappresentati da \n) appaiono solo alla fine delle linee in questa situazione, perché sono ciò che Perl sta usando per decidere dove finisce ogni linea. s/\n//cerca l'intera riga alla ricerca di nuove righe, rimuovendo chompsemplicemente quella alla fine (se presente, poiché l'ultima riga potrebbe o meno averne una).

Le prestazioni potrebbero non essere il motivo principale da preferire chomp. Il perlcomando nella risposta di terdon sarebbe solo leggermente più lento a meno che non si stia elaborando un file enorme con righe molto lunghe. E se hai bisogno di velocità, la via di David Foerster è probabilmente ancora più veloce. chompè, tuttavia, esattamente lo strumento giusto per questo se stai usando Perl, e penso che l'intento di chompsia più chiaro di quello di s/\n//. In definitiva, probabilmente non esiste una risposta obiettiva su quale sia meglio.

Stampa di una riga finale.

Tuttavia, sconsiglio l'uso del comando di sostituzione ( $( )) solo per garantire che venga stampata una nuova riga finale. A meno che il testo che stai elaborando non sia breve, è probabile che sia piuttosto lento - deve raccogliere tutto il testo in una volta e quindi stamparlo - e rende il tuo comando più difficile da capire. Invece puoi fare come suggerito da David Foerster e correre echoo in printf '\n'seguito.

perl -pe chomp; echo

Se stai eseguendo il piping da o (come mostra David Foerster) reindirizzando da quel comando, puoi racchiuderlo in { ;}modo che l'output di entrambi i comandi sia preso insieme. Se lo stai semplicemente stampando sul terminale, puoi eseguirlo esattamente come mostrato sopra. Funziona anche se stai eseguendo il piping o il reindirizzamento al comando, perché echo/ printf '\n'non legge effettivamente alcun input. Cioè, funziona:

some-command | perl -pe chomp; echo

Mentre qui non puoi semplicemente rimuovere { ;}:

{ perl -pe chomp; echo; } | some-other-command

Oppure, se preferisci, puoi fare perlstampare la nuova riga finale stessa. Come racchiudere i comandi perle , questo approccio funziona anche se si esegue il piping o il reindirizzamento da esso (e, come tutti gli approcci, funziona anche quando si esegue il piping su di esso):echo{ ;}

perl -wpe 'chomp; END { print "\n" }'

Si noti che il comando nella risposta di terdon funziona bene anche con questi metodi di stampa della riga finale. Per esempio:

perl -pe 's/\n//'; echo
perl -pe 's/\n//; END { print "\n" }'

perl -wpe 'chomp; END { print "\n" } è lo stesso processo, un piccolo vantaggio rispetto all'aggiunta dell'eco finale
Sergiy Kolodyazhnyy

1

Utilizzando il modo solo shell:

while IFS= read -r line || [ -n "$line" ]; do printf "%s"  "$line"; done < inputfile.txt

1

Questa risposta ha una soluzione al problema che stai cercando di creare: Perché bash rimuove \ n in $ (file cat)?

Se digiti cat myfile.txtvedrai:

abc
def
ghi

Ma se digiti echo $(cat myfile.txt)vedrai:

abc def ghi

Nota: questo metodo inserisce uno spazio in cui si trovavano nuove linee separate. Ciò semplifica la lettura dell'output ma non rispetta rigorosamente l'ambito della domanda.


0

Se stai usando Bash, puoi farlo senza alcun strumento esterno.

x=($(echo line1; echo line2))
echo "${x[@]}"

Risultato:

line1 line2

Il primo comando trasforma l'output multilinea in una matrice, il secondo comando espande la matrice in più argomenti su una riga.

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.