#!/bin/bash
INT=-5
if [[ "$INT" =~ ^-?[0-9]+$ ]]; then
echo "INT is an integer."
else
echo "INT is not an integer." >&2
exit 1
fi
Baştaki ~
normal ifadede lider ne yapar ?
#!/bin/bash
INT=-5
if [[ "$INT" =~ ^-?[0-9]+$ ]]; then
echo "INT is an integer."
else
echo "INT is not an integer." >&2
exit 1
fi
Baştaki ~
normal ifadede lider ne yapar ?
Yanıtlar:
~
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 grep
ile 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_REMATCH
dizide 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
, \2
vb ., bir in sed
yedek model (ya da $1
, $2
vb 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.
REMATCH
Bit BASH_REMATCH
dizisi adı "Düzenli İfade Maç", yani "RE-Match" dan gelmektedir.
bash
Bourne benzeri olmayan kabuklarda, expr
sı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
grep -E
GNU 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. ksh93
Daha da kötüsü var. zsh
Shell 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 zsh
ve yash
aynı zamanda bir var =~
operatörü.
off-topic
! +1 (
[[ "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*" ]]
.
[[ 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 compat31
içinde bash
almak zsh
davranışı.
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).
[[ 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 ...?
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 .