rev00000010
のような文字列があり、最後の数値(この場合は10)のみが必要です。
私はこれを試しました:
TEST='rev00000010'
echo "$TEST" | sed '/^[[:alpha:]][0]*/d'
echo "$TEST" | sed '/^rev[0]*/d'
どちらも何も返しませんが、正規表現は正しいようです( regexr で試してみました)
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.
POSIXly:
test='rev00000010'
number=${test#"${test%%[1-9]*}"}
左端のゼロ以外の数字の左側にあるすべてのものを削除します。
ボーンリー/ユニバーサル:
number=`expr "x$test" : 'xrev0*\(.*\)'`
変数TESTがすでにある場合は、すべての文字を削除して印刷します
printf "%.0f\n" ${TEST//[a-z]/}
または
printf "%g\n" ${TEST//[a-z]/}
使ってはいけません %d
またはecho
-コマンドは、先頭に0
はoctal
として理解されます
さらにいくつかのオプション(@chorobaの提案に従ってパラメーター拡張を使用することもお勧めします):
sed
またはPerl
を使用して、最後の2文字以外のすべてを最後の2文字に置き換えます。これにより、最後の2つを除くすべてが効果的に削除されます。
$ sed -r 's/.*(..)/\1/' <<<$TEST
10
$ Perl -pe 's/.*(..)/\1/' <<<$TEST
10
awk
のフィールド区切り文字を2以上の0に設定し、最後のフィールドを出力します。
$ awk -F"00+" '{print $NF}' <<<$TEST
10
最後の2文字のみを抽出します。
$ grep -oP '..$' <<<$TEST
10
$ Perl -lne '/(..)$/; print $1' <<<$TEST
10
最後の10番目のバイトのみを出力します。
$ cut -b 10- <<<$TEST
10
上記のすべてがbash構文である<<<$var
を使用していることに注意してください。他のシェルで使用するには、echo "$TEST" | command
に変更します。
「最後の数」を取得するには、文字列の末尾にある数字のシーケンスを選択し、それを10進数に変換します。
Bashの場合:
[[ "$test" =~ ([1-9][0-9]*)$ ]] && echo "number: $((10#${BASH_REMATCH[1]}))"
Grepで:
echo "$test" | grep -Po "[1-9][0-9]*$"