传递2个参数时tr函数的错误行为

时间:2016-10-25 16:04:49

标签: shell tr

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

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

输出是:"你好MMM"

你知道吗?

2 个答案:

答案 0 :(得分:2)

tr命令以1对1的方式将字符映射到字符,即输入中的X映射到替换中的M(最后一个映射)。

XXX替换为变量NAME的值,您可以使用sed或参数替换,如下所示:

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

OR

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

答案 1 :(得分:1)

tr期望输入/输出集之间的1:1映射:

tr XXX NAME
   123 1234

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

如果您将命令扩展一点:

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

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