Por que "wc -c" imprime um valor a mais com eco?

13

Ao executar

echo abcd | wc -c

retorna 5.
Mas a palavra abcdtem apenas 4 caracteres.

Está echoimprimindo algum caractere especial após a palavra abcd?

E posso impedir echoque imprima isso?

user78050
fonte
1
Esteja ciente de que wc -cnão informa quantos caracteres há; apenas informa quantos bytes são.
tchrist

Respostas:

21

echoimprimir nova linha ( \n) no final da linha

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

Com algumas echoimplementações, você pode usar -n:

-n não produza a nova linha à direita

e teste:

echo -n abcd | wc -c
4

Com alguns outros, você precisa da \csequência de escape:

\c: Suprima o <newline>que segue o argumento final na saída. Todos os caracteres que seguem '\c'os argumentos devem ser ignorados.

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

Portably, use printf:

printf %s abcd | wc -c
4

(observe que wc -cconta bytes, não caracteres (embora abcd, geralmente, sejam equivalentes). Use wc -mpara contar caracteres).

بارپابابا
fonte
Observe que o ponto é que, com algumas echoimplementações (todas compatíveis com Unix, pelo menos), é apenas a echo 'abcd\c'saída abcd. echo -e 'abcd\c'em echoimplementações compatíveis com Unix seriam exibidas -e abcd.
Stéphane Chazelas
5

Se você executar echosem a -nopção, ele gravará um caractere de nova linha após os argumentos. Caso contrário, se você digitar echo foo, seu próximo prompt de shell aparecerá à direita do foo. Então,  wcestá contando a nova linha.

Como impedir a echoimpressão disso?

echo -n abcd | wc -c
G-Man diz que 'restabelece Monica'
fonte
2

Por padrão, echoimprimirá um caractere de nova linha ( \n) após a sequência (é por isso que você vê o prompt do shell na próxima linha, em vez da mesma linha em que abcdé impressa.)

Você pode tentar adicionar um -nparâmetro echopara desativar o caractere de nova linha à direita.

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