変数の文字に基づいて文字列をフィルタリングする方法は?

変数の文字に基づいて文字列をフィルタリングする方法は?

以下のコマンドの文字列変数から特殊文字を変数として渡して削除しようとしています。複数の文字の代わりに単一の文字を削除できますか?

string=#@$AAA%* 
a=#$@%*                  # Special characters which have to remove from variable
b=`echo $string|sed 's/\${a}//g'`
echo $b

答え1

最新のシェルの「パラメータ拡張」を使用するときは、外部コマンドを実行する必要はありません。

echo ${string//["$a"]}
AAA

答え2

コマンドに問題があります。

  • string=#@$AAA%*and a=#$@%*: ここで、$AAAand$@部分は変数として解釈されます。文字列が文字通り解釈されるように、単一引用符を使用する必要があります。
  • このsed部分では、リテラル文字列の置換を要求します。#$@%* ~のため何もない。個々の文字が必要な場合は、文字クラスなどの他の形式を使用する必要があります[#$@%*]。しかし、この場合は単に使用するので、はるかにtr -d簡単です。
  • また、$(…)バックティックよりも優れています。
  • <<<また、数回のサイクルを節約するために、ここではechoの代わりにstring()を使用します。
  • "Kusalanandaが変数の周りに引用符を追加するために私の答えを編集したことを確認しました。私もこれについて考えましたが、それはもっと簡単で、特定の問題には必要ないので、そうしないと思いました。しかし、私はこれが仕事をする「正しい」方法であることに同意します。"他の変数と構文の周りに引用符を追加しました$(…)。この場合は必要ありませんが、良い習慣でもあります。

だから最後のコマンドは

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

関連情報