Bashから先行文字列を削除する

Bashから先行文字列を削除する

このような文字列がありますが、rev00000010最後の数字だけが必要です。この場合は10です。

私はこれを試しました:

TEST='rev00000010'
echo "$TEST" | sed '/^[[:alpha:]][0]*/d'
echo "$TEST" | sed '/^rev[0]*/d'

正規表現は正しいようですが、どちらも何も返しません。正規表現)

答え1

渡すコマンドの意味はsed次のとおりです。行が正規表現と一致する場合は削除します。。それはあなたが望むものではありません。

echo "$TEST" | sed 's/rev0*//'

これは次のことを意味します。各行からrevを削除し、その後にいくつかのゼロを付けます。

sedそしてそれほど単純なことは必要ありません。ちょうどbashを使用してください。パラメータ拡張:

shopt -s extglob         # Turn on extended globbing.
echo "${TEST##rev*(0)}"  # Remove everything from the beginning up to `rev`
                         # followed by the maximal number of zeroes.

答え2

POSIX的に:

test='rev00000010'
number=${test#"${test%%[1-9]*}"}

一番左のゼロ以外の数字の左側の内容はすべて削除されます。

バーンリー/ユニバーサル:

number=`expr "x$test" : 'xrev0*\(.*\)'`

答え3

TEST変数がすでに存在する場合は、それを印刷してすべての文字を削除してください。

printf "%.0f\n" ${TEST//[a-z]/}

または

printf "%g\n" ${TEST//[a-z]/}

先頭の数字は次のように解釈されるため、%dor echo- コマンドを使用しないでください。0octal

答え4

「最後の数字」を取得するには、文字列の末尾にある一連の数字を選択して10進数に変換します。

強打の使用:

 [[ "$test" =~  ([1-9][0-9]*)$ ]] && echo "number: $((10#${BASH_REMATCH[1]}))"

grepを使用してください:

echo "$test" | grep -Po "[1-9][0-9]*$"

関連情報