文字列変数からすべての数字を削除したいのですが、例えば:
VARIABLE=qwe123rty567
に:
echo $VARIABLE
> qwerty
私は多くの posts を検索しましたが、sedを使用してファイル/ファイル名に出力するか、出力をエコーします。空白のため、私はそれを動作させることができませんでした:
VARIABLE=$VARIABLE | sed 's/[0-9]*//g'
bash
の場合:
$ printf '%s\n' "${VARIABLE//[[:digit:]]/}"
qwerty
[:digit:]
には、ロケールに応じて0〜9以外の文字を含めることができます。 0から9だけを削除したい場合は、代わりにC
ロケールを使用してください。
多様性のために、ここで使用する方法は
tr
:
VARIABLE=$(printf '%s' "$VARIABLE" | tr -d '0123456789')
sed
:
VARIABLE=$(printf '%s' "$VARIABLE" | sed 's/[0-9]//g')
非常に簡潔なBash拡張:
VARIABLE=${VARIABLE//[0-9]/}
そして最後に再びBash展開、今回は[[:digit:]]
文字クラス。
VARIABLE=${VARIABLE//[[:digit:]]/}
(他の人が指摘したように)[[:digit:]]
、shouldは、ロケールで数字として定義されたものすべてをカバーします。
VARIABLE=qwe123rty567
IFS=0123456789
set -f # Disable glob
printf %s $VARIABLE
qwerty
さらに操作が可能です。
VARIABLE=qwe123rty567
IFS=0123456789
set -f # Disable glob
set -- $VARIABLE
IFS=; VARIABLE=$*
printf "replaced $# numbers in \$VARIABLE. RESULT:\t%s\n" "$*"
replaced 6 numbers in $VARIABLE. RESULT: qwerty
空白(実際には、変数を引用できない)は問題の一部にすぎませんでした。
sed
を介して変数をパイプ処理するだけでは機能せず、機能しません。より正確には、「$ VARIABLE」の値をsed
にパイプしません。シェルは「$ VARIABLE」の値を実行し、その出力をsed
にパイプします。ところで、これはバグではありません-$ VARIABLEにls
やrsync
などの有効なコマンドが含まれている場合に役立ちます。
また、コマンドまたはパイプラインの出力を変数に割り当てる場合は、そのコマンド/パイプラインを$()
で囲む必要があります。
したがって、sed
を使用して変数を変更するには、次のようにする必要があります。
VARIABLE=$(printf '%s' "$VARIABLE" | sed 's/[0-9]*//g')
echo
の代わりにprintf
を使用できますが、echoは$ VARIABLE内の特定の文字シーケンス(\t
、\n
、\r
など)を解釈して動作しますなど)、printf
はしません。 echo
...を使用して多くの例に出くわすことになりますが、printf '%s'
に置き換えてください。より安全です。