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

我正在使用grep来产生将被另一个程序parsing的输出。

但是,该程序预期输出只能是数字或零字节。

现在grep输出一个换行符。 我检查了-Z选项,但它似乎不工作,因为我使用grep进行计数( -c )。

我在sh执行,而不是bash 。 因此将它embedded到echo -n "$(grep -c pattern)"也不起作用。

我怎样才能摆脱尾随的换行符?

您可以通过tr管道并将\ n转换为\ 0字符。

使用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$ 

我知道这是古老的,tr也是一样,但是我在这个问题上发生了,注意到OP说: 我正在执行sh而不是bash。 因此将它嵌入到echo -n“$(grep -c pattern)”中也不起作用。

这不像回声被使用那么多。 对于未来的访问者来说,这个不起作用的唯一原因是由于替换命令的双引号引起的。 事实上,即使使用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