如何防止grep打印出多余的换行符?

43

我正在使用grep生成输出,该输出将被另一个程序解析。

然而,该程序期望输出只包含数字或零字节。

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

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

如何去掉末尾的换行符?

3个回答

47

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

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

没有使用 tr 命令时,gdb 显示的是 4\nj\000\000,而使用了 tr 后则显示为 4\346j\000\000。其中 4 是我想要计算的数量。 - Cobra_Fast
你确定 grep 在数字后面产生了那些字符吗? - johnsyweb

29
你可以通过使用命令 tr,将 \n 转换成 \0 字符进行管道传输:
tr '\n' '\0'

4
举个例子,echo -n 'x' | md5sumecho 'x' | grep 'x' | tr '\n' '\0' | md5sum 的结果不相同,因此前者无效。请注意,我已经尽力使翻译通俗易懂,并保持了原意,没有包含任何解释和额外的信息。 - e-info128

15

我知道这是旧的内容,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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接