web-dev-qa-db-ja.com

bashの先頭の文字列を削除する

rev00000010のような文字列があり、最後の数値(この場合は10)のみが必要です。

私はこれを試しました:

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

どちらも何も返しませんが、正規表現は正しいようです( regexr で試してみました)

10
Michael Niemand

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.
16
choroba

POSIXly:

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

左端のゼロ以外の数字の左側にあるすべてのものを削除します。

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

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

変数TESTがすでにある場合は、すべての文字を削除して印刷します

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

または

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

使ってはいけません %dまたはecho-コマンドは、先頭に0octalとして理解されます

3
Costas

さらにいくつかのオプション(@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に変更します。

2
terdon

「最後の数」を取得するには、文字列の末尾にある数字のシーケンスを選択し、それを10進数に変換します。

Bashの場合:

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

Grepで:

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