Özel karakterleri Normal İfade ile eşleştirme


10

Küçük harf ve rakam içeren bir şey bulmak istersem çok kolay

üretmek_metin | grep -E '[0-9a-z]'

Köşeli ayraçlar bir dizi karakterle eşleşmek için yararlıdır, ama biraz özel olanlara ne dersiniz?
Ben, parantez kullanarak, maç için isterseniz herhangi bir karakter ama bir kapanış parantezi: bunlardan biri ]"-", her iki eğik çizgi, tire (veya tire) /ve \, bir şapka ^, iki nokta üst üste :.
Böyle görünecek mi (bunun işe yaramadığını biliyorum)?

[^] - / \ ^:]

Yanıtlar:


11

Bir Parantez İfadesinde bir değişmez değeri ]ve bir değişmez değeri eşleştirmek için bunları şu şekilde kullanmanız gerekir:-

[^]/\^:-]

veya daha da iyisi, bazı araçlar ters eğik çizgiden kaçmayı gerektirdiğinden :

[^]/\\^:-]

yani
Sağ köşeli ayraç (']') özel anlamını kaybedecek ve listede ilk olarak (varsa, ilk '^' karakterinden sonra) gerçekleşirse kendisini köşeli ayraç ifadesinde gösterecektir
ve
Kısa çizgi eksi karakteri listede ilk varsa (varsa ilk '^' sonra) veya son olarak kendisi olarak ele alınmalıdır,
bu nedenle
parantez ifadesi hem '-' hem de ']' belirtiyorsa, önce ']' ( '^', varsa) ve '-' köşeli parantez ifadesinde son olarak bulunur.
Köşeli ayraç ifadelerinin kuralları ERE ve BRE için aynıdır .


2
Güvenli tarafta olmak için ters eğik çizgiyi ikiye katlardım. Birçok awkuygulamada ve perlmesela buna ihtiyaç var .
Stéphane Chazelas

"Şapkadan kapama braketine" ne olacak? Gibi [^-]](Bu başarısız)?
iBug

2
@ iBug - kelimenin tam anlamıyla eşleştirmek istiyorsanız ilk önce doğru köşeli parantez olması gerektiği için başarısız olur. Eminim siz bahsedince o "aralık" noktasını almak değilim ^sonrada ]bu yüzden [^-]]bile hem eğer işe yaramaz ^ve ](tıpkı anlamıyla tedavi edildi [b-a]). Her neyse, örneğin ;kapanış paranteziyle eşleşmek istiyorsanız, daha önce karaktere kadar bir aralık kullanabilirsiniz ](ters eğik çizgi) ve ]parantez ifadesine ilk karakter olarak dahil edebilirsiniz [];-\\].
don_crissti

@don_crissti Ne olmuş [[.^.]-[.-.]]? Bunun işe yarayacağını hissediyorum. Diyelim ki ASCII kodu ^daha önce -.
iBug

Sorum için tembel bir çözüm buldum. Karakterleri harmanlamak için özel olan her şeyi elde edin, örneğin[^[.].][.-.]/\^:]
iBug

7

Garip bir şekilde, belirli yerlerde birkaç karaktere sahip olmanız gerekir. Sen olmalıdır ]Bir setteki ilk karakter olarak ve -bir kümesindeki son karakter olmalıdır.

Gereksinimlerinizi karşılayan bir RE [^]\^/-]:

echo 'Hello[world]-[sun] ^^ 4/5 or 3\4' | grep -Eo '[^]\^/-]' | xargs
H e l l o [ w o r l d [ s u n 4 5 o r 3 4

1
Gerçekten tuhaf değil, sadece belirsizliği önlemek gerekiyor
Kevin

1
İkinci [karakter oraya ait değildir; OP bunu hariç tutmak istemiyor.
Scott

@Scott iyi tespit edildi, teşekkür ederim. Yanıt güncellendi.
roaima
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.