web-dev-qa-db-ja.com

文字列変数から数値(ストリップ数字)を削除します

文字列変数からすべての数字を削除したいのですが、例えば:

VARIABLE=qwe123rty567

に:

echo $VARIABLE
> qwerty

私は多くの posts を検索しましたが、sedを使用してファイル/ファイル名に出力するか、出力をエコーし​​ます。空白のため、私はそれを動作させることができませんでした:

VARIABLE=$VARIABLE | sed 's/[0-9]*//g'
6
George

bashの場合:

$ printf '%s\n' "${VARIABLE//[[:digit:]]/}"
qwerty

[:digit:]には、ロケールに応じて0〜9以外の文字を含めることができます。 0から9だけを削除したい場合は、代わりにCロケールを使用してください。

10
cuonglm

多様性のために、ここで使用する方法は

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は、ロケールで数字として定義されたものすべてをカバーします。

5
ocodo
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
3
mikeserv

空白(実際には、変数を引用できない)は問題の一部にすぎませんでした。

sedを介して変数をパイプ処理するだけでは機能せず、機能しません。より正確には、「$ VARIABLE」の値をsedにパイプしません。シェルは「$ VARIABLE」の値を実行し、その出力をsedにパイプします。ところで、これはバグではありません-$ VARIABLEにlsrsyncなどの有効なコマンドが含まれている場合に役立ちます。

また、コマンドまたはパイプラインの出力を変数に割り当てる場合は、そのコマンド/パイプラインを$()で囲む必要があります。

したがって、sedを使用して変数を変更するには、次のようにする必要があります。

VARIABLE=$(printf '%s' "$VARIABLE" | sed 's/[0-9]*//g')

echoの代わりにprintfを使用できますが、echoは$ VARIABLE内の特定の文字シーケンス(\t\n\rなど)を解釈して動作しますなど)、printfはしません。 echo...を使用して多くの例に出くわすことになりますが、printf '%s'に置き換えてください。より安全です。

1
cas