¿Por qué "wc -c" imprime un valor de uno más con echo?

13

Cuando se ejecuta

echo abcd | wc -c

vuelve 5.
Pero la palabra abcdtiene solo 4 caracteres.

¿Se echoimprime algún carácter especial después de la palabra abcd?

¿Y puedo evitar echoimprimir eso?

usuario78050
fuente
1
Tenga en cuenta que wc -cno le dice cuántos caracteres tiene algo; solo dice cuántos bytes son.
tchrist

Respuestas:

21

echoimprimir nueva línea ( \n) al final de la línea

echo abcd | xxd
0000000: 6162 6364 0a          abcd.

Con algunas echoimplementaciones, puede usar -n:

-n no muestre la nueva línea final

y prueba:

echo -n abcd | wc -c
4

Con algunos otros, necesita la \csecuencia de escape:

\c: Suprima el <newline>que de lo contrario sigue al argumento final en la salida. Todos los caracteres que siguen a los '\c'en los argumentos serán ignorados.

echo -e 'abcd\c' | wc -c
4

Portablemente, use printf:

printf %s abcd | wc -c
4

(tenga en wc -ccuenta que cuenta bytes, no caracteres (aunque en el caso de abcdque sean generalmente equivalentes). Use wc -mpara contar caracteres).

بارپابابا
fuente
Tenga en cuenta que el punto es que con algunas echoimplementaciones (todas las que cumplen con Unix al menos), es solo la echo 'abcd\c'salida abcd. echo -e 'abcd\c'en echoimplementaciones compatibles con Unix se generarían -e abcd.
Stéphane Chazelas
5

Si ejecuta echosin la -nopción, escribe un carácter de nueva línea después de los argumentos. De lo contrario, si escribió echo foo, su próximo indicador de shell aparecerá a la derecha de foo. Entonces  wcestá contando la nueva línea.

¿Cómo puedo evitar echoimprimir eso?

echo -n abcd | wc -c
G-Man dice 'restablecer a Mónica'
fuente
2

De forma predeterminada, echoimprimirá un carácter de nueva línea ( \n) después de la cadena (por lo que verá el indicador de shell en la siguiente línea en lugar de la misma línea donde abcdse imprime).

Puedes intentar agregar un -n parámetro echopara deshabilitar el carácter de nueva línea final.

echo -n abcd | wc -c
4
Chirag Bhatia - chirag64
fuente