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

时间:2011-08-30 20:59:34

标签: linux grep newline

我使用grep生成将由另一个程序解析的输出。

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

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

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

如何摆脱尾随换行符?

3 个答案:

答案 0 :(得分:26)

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

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

答案 1 :(得分:18)

您可以通过tr管道传输,并将\n翻译为\0字符:

tr '\n' '\0'

答案 2 :(得分:9)

我知道这是旧的,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
相关问题