bash kullanarak değişkenden belirli karakterleri siler


122

Dot ( ) 'ı serbest bırakmak için bir değişkeni (benim durumumda geliştirme kiti sürümü) ayrıştırmak istiyorum .. Eğer version='2.3.3'istenilen çıktı 233.

Aşağıdaki gibi denedim, ancak .bana veren başka bir karakterle değiştirilmesi gerekiyor 2_3_3. İşe yatsaydı iyi tr . ''olurdu.

  1 VERSION='2.3.3' 
  2 echo "2.3.3" | tr . _

10
Hayır, gerektirmez: echo "2.3.3" | tr -d ..
Manat çalışması

1
@ manatwork Harika, işe yarıyor. Cevap olarak gönderebilirsiniz. Thanks
prayagupd

1
Çok iyi cevaplar. Ancak hedefi ikinci olarak tahmin edebilirsem, 2.11.3 ve 2.1.13 hakkında uyarılırım ... ;-) Sayılara dolgu sıfırları eklemeyi düşünün.
Rmano

1
@Rmano Gibi bir şey demek istiyorsun VERSION='2.30.3100'? .Buradaki cevapların tümü neyin kaldırılmış olduğu önemli değil.
prayagupd

2
@PrayagUpd --- Karşılaştırmalar için dönüşümden sonra sayıyı kullanacak olursanız ("bu sürüm daha yeni mi yoksa aynı mı" diyecekseniz) 2.11.3 ve 2.1.13 gibi durumlara dikkat etmeniz gerektiğini kastetmiştim. - Nokta kaldırıldıktan sonra aynı görünüyor, ancak açıkça 2.11.3 daha yeni. Ayrıca, 2.11.3 2.1.14'ten daha yenidir, ancak 2113 ve 2114'ü karşılaştırmak yanlış cevaba yol açacaktır. Bunun için bir yerde bir hatayı hatırlıyorum ...
Rmano

Yanıtlar:


135

Harici bir program yürütmeye gerek yoktur. bash'nin string manipülasyonu bunu kaldırabilir (ayrıca ksh(nereden geliyorsa) ve zsh).

$ VERSION='2.3.3'
$ echo "${VERSION//.}"
233

(Bu mermilerin kılavuzlarında bunu parametre genişletme bölümünde bulabilirsiniz.)


19
Daha fazla ayrıntı için, yukarıdaki cevabın sözdizimi, ${string//substring/replacement}görünüşe göre nihai eğik çizginin ve değiştirme dizgisinin eksikliğinin silme olarak yorumlandığı yerdir . Buraya bakınız .
sherrellbc

5
Doğru, Kabuk Parametre Genişletme bölümünde man bashaçıkça yazıyor : “ (…) Dize${parameter/pattern/string}/
boşsa

1
Benim "1.0.0"meselem , sürüm numarasının bu şekilde gelmesiydi ve sadece bu numarayı istedim, bu yüzden @ manatwork'ün değiştirdiğim şeyi önerdiğini takip ettim: "${VERSIONNUM//'"'}"ancak ben bile ekledim ' ' çünkü aksi halde çıkarması için ""benzer dizgiyi tanımıyordu .
Alexiscanny

1
@Alexiscanny, değişmez "değerde var olduğunu mu demek istediniz ? Korkarım bu yeni bir soru olarak sayılıyor, ancak sadece ikili alıntıdan kaçmaya çalışıyorum: "${VERSIONNUM//\"}" pastebin.com/3ECDtkwH
manatwork

1
Süper !! üzerinde -ashde çalışıyor !
Fr0zenFyr

87

Kronolojik sıraya göre:

tr / sed

echo "$VERSION" | tr -d .
echo "$VERSION" | sed 's/\.//g'

csh / tcsh

echo $VERSION:as/.//

POSIX kabukları:

set -f
IFS=.
set -- $VERSION
IFS=
echo "$*"

Ksh / zsh / bash / yash (ve busybox ashile inşa zaman ASH_BASH_COMPAT)

echo "${VERSION//.}"

zsh

echo $VERSION:gs/./

1
tr -d, kümeden tek bir karakter bile sildi. Ex için DCC_'yi "DCC_VersionD" den silmek istiyorum, DCC ve D'yi siler. Beklenen çıktı: SürümD. Gerçek Çıkış: Sürüm. sed bir cazibe gibi çalıştı. :) yazı için teşekkürler.
kayle

20

Başarılı cevaplara ek olarak zaten var. Aynı şey ile elde edilebilir trolan --deleteseçeneği.

echo "2.3.3" | tr --delete .

Hangisi çıkacak: 233


6
macos'ta, --deletebayrak tanınmıyor, ancak -dbunun yerine kullanabilirsiniz
Anentropic

6

Birlikte denemelisiniz sedyerine

sed 's/\.//g'


4
echo "$VERSION" | tr -cd [:digit:]

Hangi karakterleri olursa olsun, sadece rakamlarla sonuçlanır


4

Perl

$ VERSION='2.3.3'                                     
$ perl -pe 's/\.//g' <<< "$VERSION"           
233

piton

$ VERSION='2.3.3'                                     
$ python -c 'import sys;print sys.argv[1].replace(".","")' "$VERSION"
233

Eğer $VERSIONsadece rakam ve nokta içeriyor, hatta daha kısa bir şeyler yapabiliriz:

$ python -c 'print "'$VERSION'".replace(".","")'
233

( $VERSIONherhangi bir karakter içeriyor olsa da , bunun bir kod ekleme güvenlik açığı olduğuna dikkat edin ).

AWK

$ VERSION='2.3.3'
$ awk 'BEGIN{gsub(/\./,"",ARGV[1]);print ARGV[1]}' "$VERSION"
233

Veya bu:

$ awk '{gsub(/\./,"")}1' <<< "$VERSION"
233
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.