¿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
¿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
Respuestas:
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 echo
o printf '\n'
, por ejemplo:
cat file1 file2... | { tr -d '\n'; echo; } > output.txt
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
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'
$ 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
También your_command | paste -sd ''
que conserva la nueva línea final.
Si desea usar Perl para esto, puede usar su chomp
función:
perl -pe chomp
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 -p
o perl -n
base).
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 perl
comando 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. chomp
es, sin embargo, exactamente la herramienta adecuada para esto si está usando Perl, y creo que la intención chomp
es más clara que la de s/\n//
. En última instancia, probablemente no haya una respuesta objetiva sobre cuál es mejor.
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 echo
o 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 perl
imprimir la nueva línea final. Al igual que encerrando los comandos perl
y , 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" }'
perl -wpe 'chomp; END { print "\n" }
es el mismo proceso, una ventaja menor sobre la adición de eco final
Usando la forma solo de shell:
while IFS= read -r line || [ -n "$line" ]; do printf "%s" "$line"; done < inputfile.txt
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.
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.
printf
+cat
+perl
se maneja mucho mejor a través deperl -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.