Cuando ejecuto comandos en Bash (o para ser específicos wc -l < log.txt
), la salida contiene un salto de línea después. ¿Como me deshago de esto?
fuente
Cuando ejecuto comandos en Bash (o para ser específicos wc -l < log.txt
), la salida contiene un salto de línea después. ¿Como me deshago de esto?
Si su salida esperada es una sola línea , simplemente puede eliminar todos los caracteres de nueva línea de la salida. No sería raro canalizar a la utilidad 'tr', o a Perl si lo prefiere:
wc -l < log.txt | tr -d '\n'
wc -l < log.txt | perl -pe 'chomp'
También puede usar la sustitución de comandos para eliminar la nueva línea final:
echo -n "$(wc -l < log.txt)"
printf "%s" "$(wc -l < log.txt)"
Tenga en cuenta que no estoy de acuerdo con la decisión del OP de elegir la respuesta aceptada. Creo que uno debe evitar usar 'xargs' cuando sea posible. Sí, es un juguete genial. No, no lo necesitas aquí.
Si su salida esperada puede contener varias líneas , debe tomar otra decisión:
Si desea eliminar MÚLTIPLES caracteres de nueva línea del final del archivo, nuevamente use la sustitución cmd:
printf "%s" "$(< log.txt)"
Si desea eliminar estrictamente EL ÚLTIMO carácter de nueva línea de un archivo, use Perl:
perl -pe 'chomp if eof' log.txt
Tenga en cuenta que si está seguro de tener un carácter de nueva línea final que desea eliminar, puede usar 'head' de GNU coreutils para seleccionar todo excepto el último byte. Esto debería ser bastante rápido:
head -c -1 log.txt
Además, para completar, puede verificar rápidamente dónde están sus caracteres de nueva línea (u otros caracteres especiales) en su archivo usando 'cat' y la bandera 'show-all'. El carácter del signo de dólar indicará el final de cada línea:
cat -A log.txt
tr --delete '\n'
.| tr -d '\r'
De una sola mano:
fuente
echo -n `wc -l log.txt`
IFS
) en un espacio. Ejemplo:echo "a b" | xargs echo -n
;echo -n $(echo "a b")
. Esto puede o no ser un problema para el caso de uso.-e
, se interpretará como la opciónecho
. Siempre es más seguro de usarprintf '%s'
.xargs
es muy lento en mi sistema (y sospecho que también lo es en otros sistemas), por lo queprintf '%s' $(wc -l log.txt)
podría ser más rápido, yaprintf
que generalmente es una función incorporada (también porque no hay redirección de información). Nunca use backticks, han quedado en desuso en las nuevas versiones de POSIX y tienen numerosos inconvenientes.También hay soporte directo para la eliminación de espacios en blanco en la sustitución de variables Bash :
fuente
trailing_linebreak_removed=${testvar%?}
Si asigna su salida a una variable,
bash
elimina automáticamente los espacios en blanco:fuente
printf ya recorta la nueva línea final para usted:
Detalle:
%s
marcador de posición de cadena.%s\n
), no lo hará.fuente
"$(command)"
, las nuevas líneas internas se conservarán y solo se eliminará la nueva línea final . El shell está haciendo todo el trabajo aquí,printf
es solo una forma de dirigir los resultados de la sustitución de comandos nuevamentestdout
.$( )
construcción. Aquí está la prueba:printf "%s" "$(perl -e 'print "\n"')"
$ printf '%s' "$(wc -l < log.txt)"
Si desea eliminar solo la última línea nueva , canalice a través de:
sed
no agregará a\0
al final de la secuencia si el delimitador se establece enNUL
via-z
, mientras que para crear un archivo de texto POSIX (definido para terminar en a\n
), siempre generará un final\n
sin-z
.P.ej:
Y para probar no
NUL
añadido:Para eliminar varias líneas nuevas finales , canalice a través de:
fuente
sed
no proporciona-z
.Si desea imprimir la salida de cualquier cosa en Bash sin final de línea, repítala con el
-n
interruptor.Si ya lo tiene en una variable, repítalo con la nueva línea final recortada:
O puede hacerlo en una línea, en su lugar:
fuente
echo -n $(wc -l < log.txt)
tiene el mismo efecto