Как предотвратить grep от печати завершающей новой строки?

Я использую grep для вывода вывода, который будет анализироваться другой программой.

Однако, эта программа ожидает, что вывод будет только числовым или нулевым байтом.

Теперь grep выводит символ новой строки после выхода. Я проверил параметр -Z, но он не работает, поскольку я использую grep для подсчета (-c).

Я выполняю в sh, а не bash. Поэтому вложение в echo -n "$(grep -c pattern)" тоже не работает.

Как я могу избавиться от конечной новой строки?

Ответ 1

Вы можете передать его через tr и перевести символ \n на символ\0.

Ответ 2

Используйте tr -d, чтобы удалить символы в строке:

sh-3.2$ grep -c ' ' /etc/passwd | tr -d '\n'
69sh-3.2$ grep -c ' ' /etc/passwd | tr -d '\n' | xxd 
0000000: 3639                                     69
sh-3.2$ 

Ответ 3

Я знаю, что это старое, и tr работает так же хорошо, но я столкнулся с этим вопросом и заметил, что OP заявил: Я выполняю команду sh, а не bash. Так что вложение в echo -n "$ (grep -c pattern)" тоже не работает.

Это не grep или sh так, как используется эхо. Для будущих посетителей единственная причина, по которой это не сработало, - это двойные кавычки вокруг замещенной команды. На самом деле это работает даже при использовании sh.

echo -n $(grep -c pattern)

Примеры:

$ ls /dev/sd? #example of formatted output
/dev/sda  /dev/sdc  /dev/sde  /dev/sdg  /dev/sdi  /dev/sdk
/dev/sdb  /dev/sdd  /dev/sdf  /dev/sdh  /dev/sdj

$ echo $(ls /dev/sd?) #without -n, appends \n only at the end
/dev/sda /dev/sdb /dev/sdc /dev/sdd /dev/sde /dev/sdf /dev/sdg /dev/sdh /dev/sdi /dev/sdj /dev/sdk

$ echo -n $(ls /dev/sd?) #with -n, does not append the \n, but still strips the line breaks from the string
/dev/sda /dev/sdb /dev/sdc /dev/sdd /dev/sde /dev/sdf /dev/sdg /dev/sdh /dev/sdi /dev/sdj /dev/sdk

$ echo -n "$(ls /dev/sd?)" #output when double quotes are used
/dev/sda
/dev/sdb
/dev/sdc
/dev/sdd
/dev/sde
/dev/sdf
/dev/sdg
/dev/sdh
/dev/sdi
/dev/sdj
/dev/sdk