我正在使用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