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


10

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

私はこれを試しました:

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

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


回答:


16

渡したコマンドは、行が正規表現に一致する場合は削除すること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.

5

POSIXly:

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

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

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

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

1つ目は、ドット、16進数、スペースなどで分割され、test='rev 003A0.1056'が生成されnumber="3A0.1056"ます。2番目は任意のスペースで中断し、同じ値が生成されます:003A0.1056exprから。

3

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

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

または

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

使用しないでください。%dまたは、echo-commandが先頭に0あるため、次のように解釈されます。octal


2

さらにいくつかのオプション(@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
    

上記のすべてが<<<$varbashコンストラクトであることに注意してください。他のシェルで使用するには、に変更しecho "$TEST" | commandます。


1
問題を回避できる他のawkバリアントの場合awk -F"[a-z]" '{print +$NF}'
Costas

0

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

Bashの場合:

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

grepで:

echo "$test" | grep -Po "[1-9][0-9]*$"
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.