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?
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?
Respuestas:
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:
wc -l < log.txt | xargs echo -n
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ón echo
. Siempre es más seguro de usar printf '%s'
.
xargs
es muy lento en mi sistema (y sospecho que también lo es en otros sistemas), por lo que printf '%s' $(wc -l log.txt)
podría ser más rápido, ya printf
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 :
testvar=$(wc -l < log.txt)
trailing_space_removed=${testvar%%[[:space:]]}
leading_space_removed=${testvar##[[:space:]]}
trailing_linebreak_removed=${testvar%?}
Si asigna su salida a una variable, bash
elimina automáticamente los espacios en blanco:
linecount=`wc -l < log.txt`
printf ya recorta la nueva línea final para usted:
$ printf '%s' $(wc -l < log.txt)
Detalle:
%s
marcador de posición de cadena. %s\n
), no lo hará."$(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 nuevamente stdout
.
$( )
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 -z '$ s/\n$//'
sed
no agregará a \0
al final de la secuencia si el delimitador se establece en NUL
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:
$ { echo foo; echo bar; } | sed -z '$ s/\n$//'; echo tender
foo
bartender
Y para probar no NUL
añadido:
$ { echo foo; echo bar; } | sed -z '$ s/\n$//' | xxd
00000000: 666f 6f0a 6261 72 foo.bar
Para eliminar varias líneas nuevas finales , canalice a través de:
sed -Ez '$ s/\n+$//'
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:
$ testvar=$(wc -l < log.txt)
$ echo -n $testvar
O puede hacerlo en una línea, en su lugar:
$ echo -n $(wc -l < log.txt)
echo -n $(wc -l < log.txt)
tiene el mismo efecto