¿Cómo puedo imprimir una salida multilínea en la misma línea?

16

¿Existe algún método para imprimir la salida de varias líneas (salida única) en la misma línea?

Por ejemplo, si la salida es:

abc
def
qwerty

¿Es posible imprimir:

abcdefqwerty 
Shrinidhi Kulkarni
fuente

Respuestas:

13

Puede eliminar todas las apariciones de caracteres de un conjunto determinado con tr -d. Para eliminar el carácter de nueva línea, use:

tr -d '\n'

Como siempre, puede utilizar la redirección de entrada y salida y las canalizaciones para leer o escribir en archivos y otros procesos.

Si desea conservar la última línea nueva, simplemente puede agregarla nuevamente echoo printf '\n', por ejemplo:

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

Muchas maneras. Para ilustrar, he guardado su ejemplo en file:

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

Sin embargo, eso elimina todos los caracteres de nueva línea, incluido el último. En su lugar, es posible que desee hacer:

$ printf "%s\n" "$(cat file | perl -pe 's/\n//')"
abcdefqwerty
$ printf "%s\n" "$(cat file | tr -d '\n')"
abcdefqwerty
terdon
fuente
Creo que el combo printf+ cat+ perlse maneja mucho mejor a través de perl -pe 's/\n//;END{printf "\n"}' input.txt un proceso único, sin sustitución de comandos y jugando con comillas, y sin UUOC. Quizás.
Sergiy Kolodyazhnyy
7

Puede canalizar su salida multilínea a través de awk

awk '{printf "%s",$0} END {print ""}'

o usar sed:

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

Ejecución de ejemplo

$ 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

Lectura adicional: elimine el salto de línea con AWK · serverfault.SE

postre
fuente
4

También your_command | paste -sd ''que conserva la nueva línea final.

Glenn Jackman
fuente
2

Si desea usar Perl para esto, puede usar su chompfunción:

perl -pe chomp

Algunos detalles más, para aquellos que estén interesados.

Puede pasar uno o más nombres de archivo como argumentos posteriores.

perl -pe chomp file1 file2 file3

En algunos casos, es posible que no desee hacer eso , pero puede canalizar o redirigir a ese comando en su lugar. (Estas habilidades, y esa advertencia, también se aplican a cualquier otra solución perl -po perl -nbase).

Entonces, si desea procesar la salida de la ejecución some-command:

some-command | perl -pe chomp

Esto es potencialmente más rápido que el comando Perl en la respuesta de terdon . Los caracteres de nueva línea (representados por \n) solo aparecen al final de las líneas en esta situación, porque son lo que Perl está usando para decidir dónde termina cada línea. s/\n//busca en toda la línea nuevas líneas, mientraschomp solo elimina la que está al final (si la hay, ya que la última línea podría o no tener una).

El rendimiento podría no ser realmente la razón principal para preferir chomp. El perlcomando en la respuesta de terdon solo sería un poco más lento a menos que esté procesando un archivo enorme con líneas muy largas. Y si necesita velocidad, el camino de David Foerster probablemente sea aún más rápido. chompes, sin embargo, exactamente la herramienta adecuada para esto si está usando Perl, y creo que la intención chompes más clara que la de s/\n//. En última instancia, probablemente no haya una respuesta objetiva sobre cuál es mejor.

Imprimir una nueva línea final.

Sin embargo, recomiendo no usar el comando substitution ( $( )) solo para asegurar que se imprima una nueva línea final. A menos que el texto que está procesando sea corto, es probable que sea bastante lento: tiene que recopilar todo el texto a la vez y luego imprimirlo, y hace que su comando sea más difícil de entender. En cambio, puedes hacer lo que David Foerster sugirió y correr echoo printf '\n'después.

perl -pe chomp; echo

Si está canalizando desde o (como muestra David Foerster) redirigiendo desde ese comando, puede encerrarlo { ;}para que la salida de ambos comandos se tome en conjunto. Si solo lo está imprimiendo en el terminal, puede ejecutarlo exactamente como se muestra arriba. Esto funciona incluso si está canalizando o redirigiendo al comando, porque echo/ en printf '\n'realidad no lee ninguna entrada. Es decir, esto funciona:

some-command | perl -pe chomp; echo

Si bien aquí no puede simplemente eliminar el { ;}:

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

O, si lo prefiere, puede perlimprimir la nueva línea final. Al igual que encerrando los comandos perly , este enfoque funciona incluso si está canalizando o redirigiendo desde él (y, como todos los enfoques, esto también funciona cuando está canalizando hacia él):echo{ ;}

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

Tenga en cuenta que el comando en la respuesta de terdon también funciona bien con estos métodos de impresión de la nueva línea final. Por ejemplo:

perl -pe 's/\n//'; echo
perl -pe 's/\n//; END { print "\n" }'
Eliah Kagan
fuente
perl -wpe 'chomp; END { print "\n" } es el mismo proceso, una ventaja menor sobre la adición de eco final
Sergiy Kolodyazhnyy
1

Usando la forma solo de shell:

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

Esta respuesta tiene una solución al problema que está intentando crear: ¿por qué bash elimina \ n en $ (archivo cat)?

Si escribe cat myfile.txt, verá:

abc
def
ghi

Pero si escribes echo $(cat myfile.txt)verás:

abc def ghi

Tenga en cuenta que este método inserta un espacio donde solían estar las nuevas líneas separadas. Esto hace que la salida sea más fácil de leer pero no se adhiere estrictamente al alcance de su pregunta.

WinEunuuchs2Unix
fuente
0

Si está utilizando Bash, puede hacerlo sin ninguna herramienta externa.

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

Resultado:

line1 line2

El primer comando convierte la salida de varias líneas en una matriz, el segundo comando expande la matriz en múltiples argumentos en una línea.

osexp2003
fuente