传递 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
我想用参数 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