使用tr命令替换为"\ "仅得到"\"符号,如何实现预期输出?
问题与解决方法
问题详情
执行以下命令:
echo 'Hello;World' | tr ';' '\\ '
实际得到输出:
Hello\World
但预期输出是:
Hello\ World
单独用tr替换分号为空格、或替换分号为反斜杠都正常,但同时替换成反斜加拉空格就失效了。
原因分析
tr是单字符替换工具,它的逻辑是把第一个字符集里的每个字符,对应替换成第二个字符集里同位置的字符。当第一个字符集只有1个字符(这里是;),第二个字符集有多个字符时,tr只会用第二个字符集的第一个字符来做替换,所以最终只会把;换成反斜杠,空格被忽略了。
可行解法
因为tr做不了多字符替换,换用支持多字符替换的工具即可:
方法1:用sed
echo 'Hello;World' | sed 's/;/\\ /g'
执行后就能得到预期的Hello\ World。
方法2:用awk
echo 'Hello;World' | awk '{gsub(/;/, "\\ ")}1'
gsub会全局替换所有;为\ ,最后的1用来输出处理后的内容,同样能达到效果。
内容的提问来源于stack exchange,提问作者Drazer
相关产品推荐
相关产品推荐

