С GNU sed
вы можете использовать:
sed '$=;d'
Поскольку GNU sed
считает эти лишние символы после последней новой строки дополнительной строкой. GNU, sed
как и большинство утилит GNU, также поддерживает символы NUL при вводе и не имеет ограничений по длине строк (два других критерия, которые делают ввод нетекстовым согласно POSIX).
POSIXLy, добавление ответа @ Inian для поддержки слишком длинных строк и байтов NUL:
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