user1046658 Asked: 2020-06-26 12:22:36 +0800 CST2020-06-26 12:22:36 +0800 CST 2020-06-26 12:22:36 +0800 CST 为什么 tr "\oo" " " 不能替换 "\" 字符? 772 我跑了echo "\oo" | tr "\oo" " ",输出是: \ \o不是特殊字符,比如\n,那为什么 也\没有转换成空格呢? command-line tr 2 个回答 Voted Best Answer ilkkachu 2020-06-26T13:51:50+08:002020-06-26T13:51:50+08:00 \o不是特殊字符,比如\n,那为什么 也\没有转换成空格呢? 因为 shell 和 GNU tr 似乎以不同的方式处理未知的反斜杠序列。 当外壳看到"\oo"时,它会按原样保留反斜杠(我认为这是所需的标准行为)。但是当tr因此 get\oo作为它的第一个参数时,它会将 解释\o为 just o。Busybox 的tr处理方式不同,它只打印空格echo "\oo" | busybox tr "\oo" " "。 结论,不要依赖未定义的反斜杠序列,而是要在反斜杠按字面意思理解时转义它们。 例如echo '\oo' | tr '\\o' ' '改用。(单引号保护反斜杠免受 shell 的影响,第二个反斜杠转义另一个 for tr。) user535733 2020-06-26T12:50:22+08:002020-06-26T12:50:22+08:00 这个问题本质上是“你如何逃避转义'\'字符?” 答案:与您转义所有其他字符的方式相同。 $ echo "\oo" | tr "\oo" " " \ $ echo "\oo" | tr "\\oo" " " \ $ echo "\oo" | tr "\\\oo" " " (blank output)
因为 shell 和 GNU tr 似乎以不同的方式处理未知的反斜杠序列。
当外壳看到
"\oo"
时,它会按原样保留反斜杠(我认为这是所需的标准行为)。但是当tr
因此 get\oo
作为它的第一个参数时,它会将 解释\o
为 justo
。Busybox 的tr
处理方式不同,它只打印空格echo "\oo" | busybox tr "\oo" " "
。结论,不要依赖未定义的反斜杠序列,而是要在反斜杠按字面意思理解时转义它们。
例如
echo '\oo' | tr '\\o' ' '
改用。(单引号保护反斜杠免受 shell 的影响,第二个反斜杠转义另一个 fortr
。)这个问题本质上是“你如何逃避转义'\'字符?”
答案:与您转义所有其他字符的方式相同。