Hapus string terkemuka di bash

10

Saya memiliki string seperti rev00000010dan saya hanya ingin nomor terakhir, 10 dalam hal ini.

Saya sudah mencoba ini:

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

keduanya tidak menghasilkan apa-apa, meskipun regex tampaknya benar (dicoba dengan regexr )

Michael Niemand
sumber
terkait: stackoverflow.com/questions/16623835/…
Ciro Santilli 冠状 病毒 审查 六四 六四 事件

Jawaban:

16

Perintah yang Anda berikan sedberarti: jika suatu baris cocok dengan regex, hapuslah . Bukan itu yang Anda inginkan.

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

Ini berarti: pada setiap baris, hapus rev diikuti oleh sejumlah nol.

Juga, Anda tidak perlu seduntuk hal yang sederhana. Cukup gunakan bash dan ekspansi parameternya :

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.
choroba
sumber
5

POSIXly:

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

Akan menghapus semua hal di sebelah kiri digit paling tidak nol.

Secara singkat / universal:

number=`expr "x$test" : 'xrev0*\(.*\)'`
Stéphane Chazelas
sumber
Yang pertama akan putus dengan titik, hex, spasi, dll: test='rev 003A0.1056'akan menghasilkan number="3A0.1056". Yang kedua akan pecah pada ruang apa pun, nilai yang sama akan menghasilkan: 003A0.1056dari expr.
3

Jika Anda sudah memiliki variabel TEST, cetak saja dengan semua huruf dihapus

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

atau

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

Jangan gunakan %datau echo-perintahkan nomor karena memimpin 0dipahami sebagaioctal

Costas
sumber
2

Beberapa opsi lagi (walaupun saya juga menyarankan Anda menggunakan Parameter Expansion seperti yang disarankan oleh @choroba):

  • Gunakan sedatau perluntuk mengganti semuanya kecuali dua karakter terakhir dengan dua karakter terakhir. Ini secara efektif menghapus semuanya kecuali dua yang terakhir.

    $ sed -r 's/.*(..)/\1/' <<<$TEST
    10
    $ perl -pe 's/.*(..)/\1/' <<<$TEST
    10
    
  • Set awkpembatas bidang menjadi 2 atau lebih 0s dan cetak bidang terakhir:

    $ awk -F"00+" '{print $NF}' <<<$TEST
    10
    
  • Ekstrak hanya dua karakter terakhir:

    $ grep -oP '..$' <<<$TEST
    10
    $ perl -lne '/(..)$/; print $1' <<<$TEST
    10
    
  • Cetak hanya byte terakhir ke-10:

    $ cut -b 10- <<<$TEST
    10
    

Perhatikan bahwa semua penggunaan di atas <<<$varyang merupakan konstruksi bash. Untuk menggunakannya di shell lain, ubah ke echo "$TEST" | command.

terdon
sumber
1
Untuk varian lain yang awk yang dapat menghindari beberapa masalahawk -F"[a-z]" '{print +$NF}'
Costas
0

Untuk mendapatkan "angka terakhir", pilih urutan angka apa saja di akhir string, dan ubah menjadi angka desimal:

Dengan Bash:

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

Dengan grep:

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

sumber