Bash içindeki önde gelen dizeyi kaldır


Yanıtlar:


16

sedDemek istediğiniz komutlar : bir satır normal ifadeyle eşleşiyorsa silin . İstediğin bu değil.

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

Bu şu anlama gelir: her satırda devir ve ardından istediğiniz sıfırı kaldırın.

Ayrıca, sedbu kadar basit bir şeye ihtiyacınız yok . Sadece bash ve parametre genişletmesini kullanın :

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]*}"}

En soldaki sıfır olmayan rakamın solundaki her şeyi kaldıracaktı.

Bournely / evrensel:

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

İlki nokta, altıgen, boşluk vb . İle kırılacaktır: test='rev 003A0.1056'üretecektir number="3A0.1056". İkincisi herhangi bir alanı kıracak, aynı değer üretecektir: 003A0.1056expr.

3

TEST değişkeniniz zaten varsa, tüm harf kaldırılmış olarak yazdırın

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

veya

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

Kullanmayın %dveya echo-komut numaralarını kullanmayın 0.octal


2

Birkaç seçenek daha (@choroba tarafından önerildiği gibi Parametre Genişletme'yi de kullanmanızı öneririm):

  • Son iki karakter dışındaki her şeyi son iki karakterle değiştirmek için sedveya tuşlarını kullanın perl. Bu, son ikisi hariç her şeyi etkili bir şekilde siler.

    $ sed -r 's/.*(..)/\1/' <<<$TEST
    10
    $ perl -pe 's/.*(..)/\1/' <<<$TEST
    10
    
  • Set awk2 veya daha fazla 0s için öğretmen alan sınırlayıcı ve son alanı yazdırın:

    $ awk -F"00+" '{print $NF}' <<<$TEST
    10
    
  • Yalnızca son iki karakteri ayıkla:

    $ grep -oP '..$' <<<$TEST
    10
    $ perl -lne '/(..)$/; print $1' <<<$TEST
    10
    
  • Yalnızca 10. son baytı yazdır:

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

Yukarıdaki kullanımın <<<$varbir bash yapısı olduğunu unutmayın. Diğer kabuklarda kullanmak için olarak değiştirin echo "$TEST" | command.


1
Bazı problemlerden kaçınabilecek awk diğer varyant içinawk -F"[a-z]" '{print +$NF}'
Costas

0

"Son sayı" yı almak için, dizenin sonundaki herhangi bir rakam dizisini seçin ve ondalık sayıya dönüştürün:

Bash ile:

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

Grep ile:

echo "$test" | grep -Po "[1-9][0-9]*$"
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.