[[: Space:]]] öğesinin bash içindeki anlamı nedir?


23

Bir bash betiğine rastladım. [[:space:]]Bir bash betiğinde ne anlama geliyor? Neden çift kolonlu?

Yanıtlar:


35

Bu bash kılavuzda, gerçekten, ama sen hangi aradığınızı bilmek yardımcı olur değil sen de aradığınızı bilmiyorsanız yararlı. Aradığınız Eğer [[sizin tarafından deli diye [[ expression ]]koşullu ifadesi bölümüne. Ek olarak, :space:sizi aramak aynı bölümün altında iki örnekte de bulunmaktadır. Bu örnekte, ekmek kırıntısını takip edebilirsiniz:

Örneğin, sıfır, boşluk karakterleri, sıfır veya bir 'a' örneği içeren herhangi bir sayıdan oluşan bir karakter dizisi varsa, aşağıdakiler bir satır (kabuk değişken satırında saklanır) ile eşleşir. 'b':

[[ $line =~ [[:space:]]*?(a)b ]]

... [[:space:]]bölümün "boşluk karakterlerine" karşılık geldiğini bir araya getirebildiğiniz , ancak bunun sadece edebi bir boşluk karakteri olduğunu ve tüm karakter sınıflarını temsil etmediğini düşündüğünüz için affedilebilir .

Eğer (??) " space", Çevrimiçi bash el kitabındaki dizgiyi (yani, "boşluk" kelimesini izleyen bir boşluk) ararsanız , üzerinden geçecek yaklaşık 32 maç "sadece" vardır. Onuncu kişi burada olacak:

'[' Ve ']' içinde karakter sınıfları [: class:] sözdizimi kullanılarak belirtilebilir, burada sınıf POSIX standardında tanımlanan aşağıdaki sınıflardan biridir:

alnum   alpha   ascii   blank   cntrl   digit   graph   lower
print   punct   space   upper   word    xdigit

Bir karakter sınıfı, o sınıfa ait herhangi bir karakterle eşleşir.

Bu da sizi "karakter sınıfı" terimini arayabileceğiniz ve bulabileceğiniz POSIX standardına götürecektir.

wctype, wctype_l - seni şu ana kadar götüren karakter sınıfını tanımlar :

Wctype () [CX] [Option Start] ve wctype_l () [Option End] işlevleri, geçerli yerel ayardaki [CX] [Option Start] karakter türü bilgileri tarafından tanımlanan kodlanmış karakter kurallarına göre wctype_t değerlerini belirler. veya yerel tarafından temsil edilen yerel ayarda, sırasıyla [Seçenek Sonu] (kategori LC_CTYPE).

Daha sonra setlocale bağlantısını izlediyseniz, nihayet Locale bölümünde gerçek cevabınızı alacaksınız :

uzay

Beyaz boşluk karakterleri olarak sınıflandırılacak karakterleri tanımlayın. POSIX yerelinde tam <space>, <form-feed>, <newline>, <carriage-return>, <tab>, and <vertical-tab>olarak dahil edilecektir.

Bir yerel ayar dosyasında, üst, alt, alfa, basamak, grafik veya xdigit anahtar sözcükleri için hiçbir karakter belirtilmemelidir. <space>, <form-feed>, <newline>, <carriage-return>, <tab>, and <vertical-tab>Taşınabilir karakter kümesi ve sınıf boş yer alan herhangi bir karakter otomatik olarak bu sınıfa dahildir.


1
LESS=+'/Within \[ and \],' man bash32 nharici komut yerine manuel eşleşmeyi bulmak daha kolay :-).
Isaac,

5
@Iacac, bence asıl mesele adama balık tutmayı öğretmektir. Bu, bilmiyordum dedi, bunun less +"$cmd"için teşekkürler.
JoL

3
Aslında, OP'nin bakış açısına göre cevap verdim; dışın []içten bağımsız olduğunu tespit edemedikleri için affedilebilirler []. Yanıtın ne olduğu hakkında fazla bir şey bilmeden, sorudan cevaba bir yol bulmaya çalıştım , ancak biraz şanslı tahminler aldı :)
Jeff Schaller

17

Sadece Bash için değil, POSIX notasyonunun bir parçası.

POSIX Nedir?

POSIX veya "uniX için Taşınabilir İşletim Sistemi Arabirimi", bir (UNIX) işletim sisteminin desteklemesi gereken bazı işlevleri tanımlayan bir standartlar topluluğudur. Bu standartlardan biri, düzenli ifadelerin iki lezzetini tanımlar.

POSIX Parantez İfadeleri

POSIX parantezi ifadeleri özel bir tür karakter sınıflarıdır. POSIX parantezi ifadeleri, normal karakter sınıfları gibi, bir karakter kümesinden bir karakterle eşleşir.

Standart POSIX

[[:alnum:]]   Alphanumeric characters
[[:alpha:]]   Alphabetic characters
[[:blank:]]   Space and tab
[[:cntrl:]]   Control characters
[[:digit:]]   Digits
[[:graph:]]   Visible characters (anything except spaces and control characters)
[[:lower:]]   Lowercase letters
[[:print:]]   Visible characters and spaces (anything except control characters)
[[:punct:]]   Punctuation (and symbols).
[[:space:]]   All whitespace characters, including line breaks
[[:upper:]]   Uppercase letters
[[:xdigit:]]  Hexadecimal digits

Yok Standartlar

[[:ascii:]]   ASCII characters
[[:word:]]    Word characters (letters, numbers and underscores)

eski sözdizimi (birisi bunlara referans bulabilir mi?)

[[:<:]]       Start of Word 
[[:>:]]       End of Word

Daha fazla bilgiyi burada bulabilirsiniz: wiki


1
[[:ascii:]]Ve [[:word:]]POSIX sınıfları (göründükleri olmayan bashya spesifik) ve ben bulamıyorum [[:<:]]ne de [[:>:]]ya. Daha iyi bir referans olabilir pubs.opengroup.org/onlinepubs/9699919799/basedefs/…
Kusalananda

1
Evet, [[:ascii:]]ve [[:word:]]standart POSIX sınıfı değildir. için [[:<:]]ve [[:>:]]ben herhangi bir referans bulamıyorum, ama aynı isimli bir \b. en.wikipedia.org/wiki/Regular_expression#Character_classes
Nima

Postgres, aşağıdakilerin kullanımını [[:<:]]ve kullanımlarını tanımlar : Bu, POSIX 1003.2
Isaac

[[:<:]]FreeBSD'de de PostgreSQL'de olduğu gibi aynı uyarıya
ilkkachu

1
Ve [[:ascii:]]ve [[:word:]]desen eşleştirme Bash ders çalışma değil, normal ifadelerde (sistemimde en azından, ben Bash sistemin regex kütüphanesini kullanır düşünüyorum). Bah.
ilkkachu

9

Düzenli ifadelerde ve dosya adı globs / shell modellerinde, [...]yapı, parantez içinde listelenenlerin herhangi bir karakteriyle eşleşir. Bu parantez içinde, bir dizi adlandırılmış standart karakter karakteri sınıfı kullanılabilir. Bunlardan biri, [:space:]boşluk karakterleriyle eşleşen ( \sPerl regexes'teki gibi ). Örneğin Bash'in kılavuzunda Örüntü Eşleştirme'ye bakınız.

Yani, [[:space:]]düzenli bir ifadenin veya örüntü eşleşmesinin, yalnızca boşlukla eşleştirilen bir parçasıdır.

Ör. Bir desen eşleşmesi (standart kabuk, Bash'e özgü değil):

case $var in 
    *[[:space:]]*) echo "'$var' contains whitespace";;
esac

veya bir regex (Bash):

if [[ $var =~ [[:space:]] ]]; then
    echo "'$var' contains whitespace"
fi

Parantez ifadelerinin [...]normal ifadelerde ve kabuk modellerinde aynı şekilde çalışmasına rağmen , genellikle aynı olmadıklarını unutmayın . ( caseve [[ string == pattern ]]desen eşleşmeleri [[ string =~ regex ]]kullanır, regex'ler kullanır.)

Normal ifadeler ayrıca kabuğa özgü değildir, örn. awkVe sedde kullanılırlar ve örn. Linux adam sayfasında açıklanırlar.regex(7)

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.