Bash testi: “= ~” ne yapar?


Yanıtlar:


46

~Aslında operatör parçası olan =~kendi sağda genişletilmiş düzenli ifade soldan onun için dize düzenli bir ifade eşleştirmesi gerçekleştirir.

[[ "string" =~ pattern ]]

Dize alıntı yapılması gerektiğini ve düzenli ifadenin alıntılanmaması gerektiğini unutmayın.

Benzer bir operatör, Perl programlama dilinde kullanılır.

Anlaşılan normal ifadeler bash, GNU'nun bayrak grepile anladığı ifadelerle aynıdır -E, yani genişletilmiş düzenli ifadeler kümesi.


Biraz konu dışı, ama bilmek güzel:

Yakalama grupları içeren normal bir ifadeyle eşleşirken, her grup tarafından yakalanan dizenin kısmı BASH_REMATCHdizide bulunur. Bu dizi tekabül sıfırıncı / ilk giriş &yerine deseninde sed'in ikame komutu (veya $&Perl) deseni ile eşleşen dize bit, itibaren indeksi 1 giriş ve karşılık gelirken için \1, \2vb ., bir in sedyedek model (ya da $1, $2vb Perl), yani her bir parantez ile eşleşen bit.

Örnek:

string=$( date +%T )

if [[ "$string" =~ ^([0-9][0-9]):([0-9][0-9]):([0-9][0-9])$ ]]; then
  printf 'Got %s, %s and %s\n' \
    "${BASH_REMATCH[1]}" "${BASH_REMATCH[2]}" "${BASH_REMATCH[3]}"
fi

Bu çıktı olabilir

Got 09, 19 and 14

eğer şimdiki zaman 09:19:14 olur.

REMATCHBit BASH_REMATCHdizisi adı "Düzenli İfade Maç", yani "RE-Match" dan gelmektedir.


bashBourne benzeri olmayan kabuklarda, exprsınırlı düzenli ifade eşleştirmesi için de kullanılabilir (yalnızca basit düzenli ifadeler kullanarak).

Küçük bir örnek:

$ string="hello 123 world"
$ expr "$string" : ".*[^0-9]\([0-9][0-9]*\)"
123

2
Sadece grep -EGNU sistemlerinde ve sadece model olarak işaretlenmemiş bir değişken kullanıldığında ne anlama geldiğiyle aynıdır [[ $var = $pattern ]](bkz. [[ 'a b' =~ a\sb ]]Vs p='a\sb'; [[ 'a b' =~ $p ]]). Ayrıca, kabuk alıntılamanın RE operatörlerinin anlamını etkilediğini ve RE işlemesini etkileyebilecek kabuk belirteçleme için bazı karakterlerin alıntılanması gerektiğine dikkat edin. [[ '\' =~ [\/] ]]false döndürür. ksh93Daha da kötüsü var. zshShell ve RE alıntılarının açıkça ayrı olduğu daha mantıklı bir yaklaşım için bakınız (veya bash 3.1). [Arasında yerleşik zshve yashaynı zamanda bir var =~operatörü.
Stéphane Chazelas

2
çok havalı off-topic! +1 (
JJoao

StéphaneChazelas @ Nasıl "saner" zsh bu maçın ?: hem olmasıdır [[ "This is a fine mess." =~ T.........fin*es* ]]; [[ "This is a fine mess." =~ T.........fin\*es\* ]]. Ya da bir alıntı *aynı zamanda? [[ "This is a fine mess." =~ "T.........fin*es*" ]].
sorontar,

Daha akılcı (IMO) kurallar çok daha basit. Kabuk alıntı ve RE kaçan açıkça belirgindir. Olarak [[ a =~ .* ]]ya da [[ a =~ '.*' ]]ya da [[ a =~ \.\* ]], aynı .*RE geçirilir =~operatör. OTH, içinde bash, [[ '\' =~ [)] ]]bir hata döndürür, sen ister denemeye olmadan bilemez [[ '\' =~ [\)] ]]maçların? Peki ya [[ '\' =~ [\/] ]](ksh93'te yapar). Peki ya c='a-z'; [[ a =~ ["$c"] ]]( =operatörle karşılaştır )? Ayrıca bakınız: [[ '\' =~ [^]"."] ]]bunu yapabilirsiniz sahte ... Not döndürür shopt -s compat31içinde bashalmak zshdavranışı.
Stéphane Chazelas,

zsh/ bash -o compat31'ın davranışı [[ a =~ '.*' ]]da [ a '=~' '.*' ]( [destekleyen uygulamalar için =~) veya ile tutarlıdır expr a : '.*'. OTOH, [[ a = '*' ]]vs ile tutarlı değil [[ a = * ]](ancak o zaman, globs kabuk dilin bir parçası, RE'ler değil).
Stéphane Chazelas

4

[[ expression ]]Bölümün altındaki bash man sayfalarını okumalısınız .

An additional binary operator, =~, is available, with the same precedence as == and !=. When it is used, the string to the right of the operator is considered an extended regular expression and matched accordingly (as in regex(3)).

Uzun lafın kısası, =~tıpkı ==ve gibi bir operatördür !=. Dizedeki gerçek regex ile sağındaki hiçbir ilgisi yoktur.


=~Gerçek hayatta kullanımını gösteren bazı örnekler bulabilir misiniz ...?
George Vasiliou

1
@GeorgeVasiliou Çıkışı bir komuttan değişkene koyan komut dosyalarında oldukça sık kullanıyorum. Ardından değişken bazı dize desenleriyle eşleşip eşleşmediğini görmek için kontrol edilir. Bu, örneğin bu komuttan gelen bazı hata çıktısını temel alarak bir işlem yapmak istiyorsanız yararlıdır.
Michael Martinez

@Sokel Bazıları için “RTFM” den yapılması daha kolay. Nothing man [[ expresssion ]]ve man [[hiçbir şey döndürmeyin. Dahili bir bash komutundan help [[bu yana yararlı bilgi verir - [[fakat =~temel veya genişletilmiş regex sözdizimi kullanıp kullanmadığını söylemez . Quot Aldığınız metin bash man sayfasındandır. “Beşli erkek sayfalarını oku” dediğini fark ettim, ama ilk önce, beşli erkek sayfalarını okumak istediğini sanıyordum. Her halükarda man bash, 4139 satır (72 sayfa) uzunluğunda büyük bir dosya döndürür. /▒▒▒Lezzeti =~- aynen - belirtilmemiş olan bir regex alan tuşuna basılarak aranabilir .
Alex Quinn
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.