11

この問題を解決する他の方法が機能することは承知していますが (現在は「expr」メソッドを使用しています)、bash 組み込み関数のみでそれを行う方法を理解できないことに悩まされています。

${variable##remove} コンストラクトを使用して変数から先頭のゼロを削除しようとすると、1 つのゼロまたはすべての数値を削除することしかできません。

string="00123456"
echo "${string##0}" // Only the first 0 is removed
echo "${string##0*0}" // The whole string is removed
echo "${string#0*0}" // Works

string="01230"
echo "${string##0}" // Works
echo "${string##0*0}" // The whole string is removed
echo "${string#0*0}" // Again, the whole string is removed

bash のマニュアルを 2 回読んで、正しく行っているかどうかを確認しましたが、公式ドキュメントはせいぜいまばらです。extglob を有効にするとこの問題も解決される可能性があることは承知していますが、このような単純な問題ではやり過ぎのように思えます。

明らかな何かが欠けているのでしょうか、それとも bash 関数のみを使用して文字列から 1 つまたは複数の先行ゼロを削除するのは本当に難しいのでしょうか?

4

5 に答える 5

21

0次の例では、先頭の sをすべて文字列から削除します。

$ string="000123456000"
$ echo "${string#"${string%%[!0]*}"}"
123456000

"${string%%[!0]*}"条件を満たす文字列の最長の末尾部分を削除した後、一致を返すと言って[!0]*、基本的に先頭のゼロを返します。

"${string#"${string%%[!0]*}"}"上記によって返された部分を文字列の先頭から削除します。


または、シェル演算を使用できます。

$ string="0000123456000"
$ echo $((10#$string))
123456000
于 2013-11-08T14:40:27.813 に答える
7

さらに別の方法ですが、これには extglob 機能を有効にする必要があります。

echo ${string/#+(0)/}
于 2013-11-08T14:57:08.820 に答える
4

これは、ワンライナーで先頭のゼロを削除する純粋な BASH の方法でもあります。

string="00123456"
[[ "$string" =~ ^0*(.+)$ ]] && echo "${BASH_REMATCH[1]}"
123456

注: regexp は、"00000" 入力のエッジ ケースをカバーして、単に "0" に変換します。

于 2013-11-08T14:33:03.037 に答える