如何防止grep打印尾随换行符?

Cob*_*ast 21 linux grep newline

grep用来生成将由另一个程序解析的输出.

但是,该程序只希望输出为数字或零字节.

现在在grep输出后输出换行符.我已经检查了-Z选项,但它似乎不起作用,因为我使用grep进行count(-c).

我正在执行sh,而不是bash.因此嵌套它echo -n "$(grep -c pattern)"也不起作用.

如何摆脱拖尾换行?

Joh*_*web 31

使用tr -d字符串中删除字符:

$ grep -c ' ' /etc/passwd | tr -d '\n'
69$ grep -c ' ' /etc/passwd | tr -d '\n' | xxd 
0000000: 3639                                     69
$ 
Run Code Online (Sandbox Code Playgroud)


Ama*_*9MF 20

你可以管它并将其tr翻译\n成一个\0角色:

tr '\n' '\0'
Run Code Online (Sandbox Code Playgroud)

  • 无效,例如:`echo -n 'x' | md5sum` 与使用 `echo 'x' | md5sum` 的结果不同 grep 'x' | grep 'x' | tr '\n' '\0' | md5sum`。 (4认同)

use*_*dly 10

我知道这是旧的,并且tr也可以正常工作,但我遇到了这个问题并注意到OP说: 我正在执行sh,而不是bash.因此将它嵌套到echo -n"$(grep -c pattern)"中也不起作用.

这不是grep或sh,而是如何使用echo.对于未来的访问者来说,这不起作用的唯一原因是由于替换命令周围的双引号.实际上,即使使用sh,以下也可以.

echo -n $(grep -c pattern)
Run Code Online (Sandbox Code Playgroud)

例子:

$ 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
Run Code Online (Sandbox Code Playgroud)