Чому “wc -c” друкує значення ще одного з відлунням?


13

При бігу

echo abcd | wc -c

вона повертається 5.
Але слово abcdмає лише 4 символи.

Чи echoдрукується якийсь особливий символ після цього слова abcd?

І чи можу я запобігти echoдруку?



1
Будь ласка, майте на увазі, що wc -cне говорить про те, скільки символів щось є; він лише вказує, скільки байтів.
tchrist

Відповіді:


21

echoдрукувати новий рядок ( \n) в кінці рядка

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

З деякими echoреалізаціями ви можете використовувати -n:

-n не виводити новий рядок

і тест:

echo -n abcd | wc -c
4

Для деяких інших вам потрібна \cпослідовність втечі:

\c: Придушити те, <newline>що в іншому випадку слідує остаточному аргументу у висновку. Усі символи, наведені '\c'в аргументах, ігноруються.

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

Портативно використовуйте printf:

printf %s abcd | wc -c
4

(зауважте, що wc -cрахує байти, а не символи (хоча у випадку, abcdяк правило, вони рівноцінні). Використовуйте wc -mдля підрахунку символів)


Зауважте, що справа в тому, що з деякими echoреалізаціями (як мінімум, всі сумісні з Unix), це echo 'abcd\c'виводиться abcdпоодинці. echo -e 'abcd\c'в сумісних версіях Unix echoбуде виводитися -e abcd.
Стефан Шазелас

5

Якщо ви запускаєте echoбез -nпараметра, він записує символ аргументу після рядків. В іншому випадку, якщо ви введете echo foo, наступне запит оболонки з’явиться праворуч від поля foo. Так  wcвважається підрахунок нового рядка.

Як я можу запобігти echoдруку цього?

echo -n abcd | wc -c

2

За замовчуванням echoнадрукує символ рядка ( \n) після рядка (саме тому ви побачите підказку оболонки в наступному рядку замість того самого рядка, де abcdдрукується.)

Ви можете спробувати додати -nпараметр, echoщоб вимкнути символ нового рядка.

echo -n abcd | wc -c
4
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.