Yanıtlar:
Sanki ?
diğer birçok normal ifade motorlarında ve araçlar "sıfır maç ya da her türlü biri kendinden önce gelen".
Örneğinizde, öğesine \?
uygulanır [ -]
, yani bir boşluk veya eksi ile eşleşmeye çalışır, ancak boşluk veya eksi isteğe bağlıdır.
Yani bunlardan herhangi biri eşleşecek:
555 1234
555-1234
5551234
Bunun \?
yerine yazılmasının nedeni ?
geriye dönük uyumluluk içindir.
Orijinal sürümünde, sadece grep
basit ?
bir soru işareti anlamına gelen "temel normal ifade" adı verilen farklı bir normal ifade türü kullanılmıştır .
GNU grep'in sıfır veya bir işlevselliğe sahip olabilmesi için eklediler, ancak \?
kullanılan komut dosyalarının ?
beklendiği gibi çalışabilmesi için sözdizimini kullanmak zorunda kaldılar .
Grep'in -E
"yaygın düzenli ifadeler" olarak adlandırılan daha yaygın olan normal ifade türünü kullanmasını sağlayan bir seçeneği olduğunu unutmayın .
man 1 grep
:
-E, --extended-regexp
Interpret PATTERN as an extended regular expression
(ERE, see below). (-E is specified by POSIX.)
-G, --basic-regexp
Interpret PATTERN as a basic regular expression (BRE, see below).
This is the default.
...
Repetition
A regular expression may be followed by one of several repetition operators:
? The preceding item is optional and matched at most once.
...
grep understands three different versions of regular expression syntax:
“basic,” “extended” and “perl.”
...
Basic vs Extended Regular Expressions
In basic regular expressions the meta-characters ?, +, {, |, (, and )
lose their special meaning; instead use the backslashed versions
\?, \+, \{, \|, \(, and \).
Daha fazla bilgi:
grep -E
resmi POSIX yoludur. egrep
susv2 (1997) 'de kullanımdan kaldırılmış ve susv3 (2001)' de POSIX ve Unix spesifikasyonlarından çıkarılmıştır.
\?
gerçi bir GNUizm.
Ne yazık ki, düzenli ifadelerin tam sözdizimi farklı programlar arasında biraz değişir: grep regexes, C ++ regexes ile tam olarak aynı olmayan Em regexes ile tam olarak aynı olmayan sed regexes ile tam olarak aynı değildir. üzerinde. Daha da kötüsü, grep gibi "standart" bir araç bile farklı Unix benzeri işletim sistemleri arasında biraz farklılık gösterebilir.
Bir normal ifadede, bazı karakterlerin özel bir anlamı vardır (örneğinizdeki köşeli parantezler gibi) ve önüne "ters eğik çizgi koyarak" kaçtığınız zaman "normal karakterler olarak normal anlamlarına geri dönün (böylece bir tam parantez \ [) olarak yazılmıştır. Diğerleri ise tam tersi şekilde çalışırlar ve yalnızca kaçtıklarında özel bir anlam kazanırlar (örneğin, düz n yalnızca bir harftir, \ n bir satır beslemesidir). Ve bunlar yine, normal ifade uygulamaları arasında değişebilir.
Çoğu normal ifade uygulamasında, bir soru işareti önceki öğenin isteğe bağlı olduğu anlamına gelirken, bir çıkış işareti soru işareti (\?) Değişmez bir soru işaretidir. Ama birkaç lehçede, bu tam tersi. Örneğiniz her iki şekilde de mantıklı olabilir, ancak lehçelerden birine sahip olduğunuzdan şüpheleniyorum? değişmez ve \? isteğe bağlı semboldür. Yani normal ifadeniz muhtemelen "üç basamaklı, isteğe bağlı olarak bir boşluk veya kısa çizgi ve ardından dört basamaklı" anlamına gelir.
(\ {3 \} gibi yapılarda "önceki öğenin tam olarak 3'ü" anlamına gelen açık bir ipucu daha görülebilir. Çoğu normal lehçede bu {3} yazılır ve \ {gerçek bir ayraç olur .)
Bu, diğer yanıtlarda zaten yer alan bilgilerin hızlı bir özetidir.
İçinde grep
, ?
değişmez bir soru işareti karakteriyle eşleşir ve \?
kendisinden önce gelenlerin sıfır ya da bir tekrarını belirtir. Dolayısıyla, sorunuzdaki örnekte [ -]\?
bir boşlukla veya bir tire işareti ile ya da hiçbir şeyle eşleşmez.
Gelen egrep
veya grep -E
bu tersi; \?
değişmez bir soru işaretiyle eşleşir ve ?
sıfır veya bir tekrar olduğunu belirtir.
Bu GNU grep için geçerlidir; GNU olmayan grep uygulamaları için ayrıntılar biraz farklılık gösterebilir. Özellikle, grep
ve egrep
tarihsel olarak iki ayrı program grep
vardı ve sanırım yaşlıların-E
seçeneği. POSIX belirtiyor grep -E
, ancak (keşfettiğim için şaşırdım) bahsetmiyor egrep
.
egrep
Komut eşdeğerdirgrep -E
. GNU grep dışındaki sürümler içingrep
,-E
seçeneği kabul edebilir veya etmeyebilir veegrep
ayrı bir program olabilir.