我运行了echo "\oo" | tr "\oo" " "
,输出是:
\
\o
不是一个特殊字符,例如\n
,那么为什么\
也不会转换成空格?
答案1
\o
不是一个特殊字符,例如\n
,那么为什么\
也不会转换成空格?
因为 shell 和 GNU tr 似乎以不同的方式处理未知的反斜杠序列。
当 shell 看到 时"\oo"
,它会保留反斜杠 (我认为这是必需的标准行为)。但是当tr
consequently\oo
作为其第一个参数时,它会将 解释\o
为o
。Busyboxtr
对此的处理方式不同,它仅打印空格echo "\oo" | busybox tr "\oo" " "
。
结论是,不要依赖未定义的反斜杠序列,但是当需要按字面意思理解时,要转义反斜杠。
例如,改用echo '\oo' | tr '\\o' ' '
。 (单引号保护反斜杠不受 shell 的干扰,第二个反斜杠将另一个反斜杠转义tr
。)
答案2
这个问题本质上是“如何转义‘\’字符?”
答案:与转义所有其他字符的方法相同。
$ echo "\oo" | tr "\oo" " "
\
$ echo "\oo" | tr "\\oo" " "
\
$ echo "\oo" | tr "\\\oo" " "
(blank output)