传递 2 个参数时 tr 函数的不良行为

bad behavior of tr function while passing 2 arguments

我想用参数 2 更改参数 1,但输出不正确

 #!/bin/sh 
    getline="hello mr XXX";    
    name="NAME";
    echo $getline  | tr "XXX" "$name" ;

输出是:"hello mr MMM"

你有什么想法吗?

tr 期望在 input/ouput 集合之间有一个 1:1 映射:

tr XXX NAME
   123 1234

由于输入中有三个相同的字符,因此只有最后一个用于映射,X #3 映射到 "replacements" 参数中的字符 #3,恰好是 M

如果您将命令扩展多一点:

$ echo hello mr XXXYZ|tr "XXXY" "NAME"
hello mr MMMEZ

Y 映射到 E,因为它们都是 in/out 集中的第 4 个字符。

tr 命令在一对一的基础上将字符映射到字符,即输入中的 X 映射到替换中的 M(最后一个映射)。

要将 XXX 替换为变量 NAME 的值,您可以使用 sed 或这样的参数替换:

$ sed 's/XXX/'"$name"'/g' <<< "hello mr XXX"
hello mr NAME

$ echo ${getline//XXX/$name}
hello mr NAME