Düzenli bir ifadede, hangi karakterlerin kaçması gerekir?


23

Genel olarak, normal ifadedeki hangi karakterlerin kaçması gerekir?

Örneğin, aşağıdakiler sözdizimsel olarak doğru değildir:

echo '[]' | grep '[]'
grep: Unmatched [ or [^

Ancak bu, bir syntatically doğru:

echo '[]' | grep '\[]'
[]

Düzenli bir ifadede hangi karakterlerden kaçılması gerektiği ve hangilerinin olmaması gerektiğine dair herhangi bir belge var mı?

Yanıtlar:


12

Bu uygulamaya bağlıdır. Örnekte [bir argüman olarak teklif verilmelidir grepama echo.

Kabuk için ( POSIX özelliklerinden ):

Alıntılama, belirli karakterlerin veya kelimelerin kabuğa olan özel anlamlarını kaldırmak için kullanılır. Alıntılama, bir sonraki paragraftaki özel karakterlerin gerçek anlamını korumak, ayrılmış kelimelerin bu şekilde tanınmasını önlemek ve burada-belge işleme dahilinde parametre genişletme ve komut değiştirmeyi önlemek için kullanılabilir (bkz. Burada-Belge).

Başvuru, kendilerini temsil etmeleri durumunda aşağıdaki karakterleri vermelidir:

|  &  ;  <  >  (  )  $  `  \  "  '  <space>  <tab>  <newline>

ve aşağıdakilerin belirli şartlar altında alıntılanması gerekebilir. Yani, bu karakterler IEEE Std 1003.1-2001'in bu cildinde başka bir yerde açıklanan koşullara bağlı olarak özel olabilir:

*   ?   [   #   ˜   =   %

Çeşitli alıntı mekanizmaları kaçış karakteri, tek tırnak işareti ve çift tırnak işaretidir. Buradaki belge, başka bir alıntı şeklini temsil eder; Here-Document'a bakınız.

Belirli programların (regex, perl, awk kullanarak) kaçma konusunda ek gereksinimleri olabilir.


8

Her uygulamanın kendine özgü bir 'özel' karakter seti olacaktır. Karşılaştığınız sorun grepkabuğun değil. Hangi karakterlerin grepgirilmesi gerektiğine ilişkin olarak , sayfanın "REGULAR EXPRESSIONS" bölümündeki bölümünü okuyun.

Kabuk için, alıntılanması gereken karakterler şunlardır:

;'"`#$&*?[]<>{}\

ve herhangi bir boşluk.

Kabuğa bağlı olarak, diğer karakterlerin de alıntılanması gerekebilir:

!^%

Kabuğun man sayfasındaki "SHELL GRAMMAR" bölümüne bakın.


Geçmiş genişlemesine sahip bazı kabuklarda ( bashdahil), !hala çift tırnak işaretleri halinde genişletilir, sadece tek tırnak işaretleri genişlemesini durduracaktır (veya kabuk seçeneğini devre dışı bırakır).
Chris Down

][her zaman değil, alıntı yapılmamalıdır. Hiçbir referans bulamadım {ve}
Matteo

8

Birden çok normal ifade türü vardır ve özel türe göre özel karakter kümesi belirlenir. Bunlardan bazıları aşağıda açıklanmıştır. Tüm durumlarda, özel karakterler ters eğik çizgiden kaçar \. Örneğin maç için [yazdığınız \[yerine. Alternatif olarak, karakterler (hariç ^), bunları birer birer köşeli parantezler arasına sararak çıkarılabilir [[].

^(Alt) ifadenin başlangıcında özel gibi bazı bağlamlarda özel olan karakterler tüm bağlamlarda çıkarılabilir.

Diğerlerinin yazdığı gibi: Kabukta ifadeyi tek tırnaklar arasına almazsanız, daha önce kaçan regex'te kabuğun özel karakterlerinden de kaçmanız gerekir. Örnek: Bunun yerine (alternatif olarak: veya ) bash gibi Bourne uyumlu mermilerde '\['yazabilirsiniz , ancak bu başka bir hikaye.\\["\[""\\["

Temel Düzenli İfadeler (BRE)

  • POSIX: Temel Düzenli İfadeler
  • Komutlar: grep,sed
  • Özel karakterler: .[\
  • Bazı bağlamlarda özel: *^$
  • Bir dize kaçış: "$(printf '%s' "$string" | sed 's/[.[\*^$]/\\&/g')"

Genişletilmiş Düzenli İfadeler (ERE)

  • POSIX: Genişletilmiş Normal İfadeler
  • Komutlar:, grep -EGNU:, sed -r* BSD:sed -E
  • Özel karakterler: .[\(
  • Bazı bağlamlarda özel: *^$)+?{|
  • Bir dize kaçış: "$(printf '%s' "$string" | sed 's/[.[\*^$()+?{|]/\\&/g')"

3

grepBRE'yi regex yöntemi olarak kullanır. Üzerinde iyi dokümantasyon vardır burada genel bir özet "onun edebi almak için herhangi bir özel karakter veya meta karakter kaçış kaçış dizileri (oluşturmaya kaçmak olurdu \n, \rbu örneğin, her zaman doğru olmasa da, vs.)", etmelisin kaçış (ve )kendi özel anlamlarını elde etmek için (geri tepme).


0

Kabuk, komut yürütmeden önce komut satırını dönüştürebilir. Hem kabuk hem grepde bazı karakterlerin özel anlamlarını kaldırmak için tırnak işareti kullanabilirsiniz. Bununla birlikte, grepkabukları farklı özel karakterlere sahiptir. Ayrıca, mevcut bir genişlemeden kaynaklanmayan çıkmamış özel karakterler, komut yürütmeden önce kabuk tarafından kaldırılır.

echo '[]' | grep '[]'

Kabuk argüman iletir []için grepve bir bozuk biçimli dirsek ifadesi olarak ayrıştırılır grep.

echo '[]' | grep \[]

Yukarıda, benzer bir dava görebiliriz. Ters eğik çizgi kaldırılır ve []bağımsız değişken olarak iletilir grep. grepHatalı biçimlendirilmiş bir braket ifadesini tanır.

echo '[]' | grep '\[]'

Son olarak, bu durumda, tırnaklar kabuk tarafından çıkarılır ve \[]argüman olarak iletilir, grepancak bu özel durumda ¹, değişmez bir parantez olarak \[yorumlanır grep. Ters eğik çizginin kabuk tarafından özel bir karakter olarak yorumlanmasını önlemek için tırnaklara ihtiyaç vardır.


IX POSIX özelliği .

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.