Как запретить grep печатать завершающий перевод строки? - PullRequest
19 голосов
/ 31 августа 2011

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

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

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

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

Как мне избавиться от завершающего перевода строки?

Ответы [ 3 ]

29 голосов
/ 31 августа 2011

Используйте tr -d для удаления символов в строке:

$ grep -c ' ' /etc/passwd | tr -d '\n'
69$ grep -c ' ' /etc/passwd | tr -d '\n' | xxd 
0000000: 3639                                     69
$ 
19 голосов
/ 31 августа 2011

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

tr '\n' '\0'
10 голосов
/ 02 декабря 2015

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

Это не grep или sh, а то, как используется echo.Для будущих посетителей единственная причина, по которой это не сработало, заключается в двойных кавычках вокруг замещаемой команды.Следующее действительно работает даже с использованием 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
...