С GNU sed
вы можете использовать:
sed '$=;d'
Поскольку GNU sed
считает эти дополнительные символы после последней новой строки дополнительной строкой. GNU sed
, как и большинство утилит GNU, также поддерживает символы NUL в своем вводе и не имеет ограничения на длину строк (два других критерия, которые делают ввод не -текстом согласно POSIX ).
POSIXly, построение -на основе ответа @Inian для поддержки слишком -длинных строк и нулевых байтов:
LC_ALL=C tr -cs '\n' '[x*]' | awk 'END {print NR}'
Эта команда tr
переводит все последовательности из одного или нескольких символов, (каждый байт интерпретируется как символ в локали C, чтобы избежать проблем с декодированием, )кроме новой строки, в одинx
символ, поэтому Входные записи awk
будут иметь длину 0 или 1 байт, а его входные данные будут содержать только x
и символы новой строки.
$ printf '%10000s\na\0b\nc\nd' | wc -l
3
$ printf '%10000s\na\0b\nc\nd' | mawk 'END{print NR}'
2
$ printf '%10000s\na\0b\nc\nd' | busybox awk 'END{print NR}'
5
$ printf '%10000s\na\0b\nc\nd' | gawk 'END{print NR}'
4
$ printf '%10000s\na\0b\nc\nd' | LC_ALL=C tr -cs '\n' '[x*]' | mawk 'END{print NR}'
4