我正在尝试从下面的命令中的字符串变量中删除特殊字符(通过将它们作为变量传递)能够删除单个字符而不是多个字符?
string=#@$AAA%*
a=#$@%* # Special characters which have to remove from variable
b=`echo $string|sed 's/\${a}//g'`
echo $b
答案1
使用最新 shell 的“参数扩展”时无需运行外部命令:
echo ${string//["$a"]}
AAA
答案2
您的命令有一些问题。
string=#@$AAA%*
anda=#$@%*
:这里$AAA
和$@
部分被解释为变量。您应该单引号字符串,以便按字面解释它们。- 对于这
sed
部分,您要求它替换文字字符串#$@%*
为了什么也没有。如果您想要单独的字符,则需要使用不同的格式,例如字符类[#$@%*]
。但是,在这种情况下,我只是使用tr -d
它,这要简单得多。 - 此外,
$(…)
优于反引号。 - 我还会使用此处字符串 (
<<<
) 而不是 echo,只是为了节省几个周期。 - 我注意到 Kusalananda 编辑了我的答案,
"
在变量周围添加了引号。我也考虑过这个问题,但认为我不会,因为它会更简单,而且对于你的具体问题来说没有必要。然而,我同意这是“正确”的做事方式。我"
在其他变量和$(…)
构造周围添加了引号;在这种情况下,它们是不必要的,但也是很好的做法。
因此最终的命令是
string='#@$AAA%*'
a='#$@%*'
b="$(<<<"$string" tr -d "$a")"
echo "$b"