Esiste un metodo per stampare output su più righe (output singolo) sulla stessa riga?
Ad esempio, se l'output è:
abc
def
qwerty
È possibile stampare:
abcdefqwerty
Esiste un metodo per stampare output su più righe (output singolo) sulla stessa riga?
Ad esempio, se l'output è:
abc
def
qwerty
È possibile stampare:
abcdefqwerty
Risposte:
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 echo
o printf '\n'
, ad esempio:
cat file1 file2... | { tr -d '\n'; echo; } > output.txt
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
È possibile reindirizzare l'output multilinea awk
awk '{printf "%s",$0} END {print ""}'
o utilizzare sed
:
sed ':a;N;$!ba;s/\n//g'
$ echo -e "1\n2\n3\n4" | awk '{printf "%s",$0} END {print ""}'
1234
$ echo -e "1\n2\n3\n4" | sed ':a;N;$!ba;s/\n//g'
1234
Ulteriori letture: rimuovere l'interruzione di linea utilizzando AWK · serverfault.SE
Inoltre, your_command | paste -sd ''
che preserva la nuova riga finale.
Se vuoi usare Perl per questo, puoi usare la sua chomp
funzione:
perl -pe chomp
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 -p
o perl -n
basata.)
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 chomp
semplicemente 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 perl
comando 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 chomp
sia più chiaro di quello di s/\n//
. In definitiva, probabilmente non esiste una risposta obiettiva su quale sia meglio.
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 echo
o 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 perl
stampare la nuova riga finale stessa. Come racchiudere i comandi perl
e , 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
Utilizzando il modo solo shell:
while IFS= read -r line || [ -n "$line" ]; do printf "%s" "$line"; done < inputfile.txt
Questa risposta ha una soluzione al problema che stai cercando di creare: Perché bash rimuove \ n in $ (file cat)?
Se digiti cat myfile.txt
vedrai:
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.
printf
+cat
+perl
sia gestita molto meglio tramite ilperl -pe 's/\n//;END{printf "\n"}' input.txt
processo singolo, nessuna sostituzione di comando e pasticciare con le virgolette e nessun UUOC. Forse.