如何根据变量中的字符过滤字符串?

如何根据变量中的字符过滤字符串?

我正在尝试从下面的命令中的字符串变量中删除特殊字符(通过将它们作为变量传递)能够删除单个字符而不是多个字符?

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%*and a=#$@%*:这里$AAA$@部分被解释为变量。您应该单引号字符串,以便按字面解释它们。
  • 对于这sed部分,您要求它替换文字字符串#$@%* 为了什么也没有。如果您想要单独的字符,则需要使用不同的格式,例如字符类[#$@%*]。但是,在这种情况下,我只是使用tr -d它,这要简单得多。
  • 此外,$(…)优于反引号。
  • 我还会使用此处字符串 ( <<<) 而不是 echo,只是为了节省几个周期。
  • 我注意到 Kusalananda 编辑了我的答案,"在变量周围添加了引号。我也考虑过这个问题,但认为我不会,因为它会更简单,而且对于你的具体问题来说没有必要。然而,我同意这是“正确”的做事方式。我"在其他变量和$(…)构造周围添加了引号;在这种情况下,它们是不必要的,但也是很好的做法。

因此最终的命令是

string='#@$AAA%*'
a='#$@%*'
b="$(<<<"$string" tr -d "$a")"
echo "$b"

相关内容