Cygwin's Grep için
Çözüm, ASCII değerini Bash cinsinden belirtebilmenizdir. "
22'de onaltılıktır.
İki nokta: İlk tırnak etrafındaki tek tırnak işaretlerini kaldırmanız gerekir, böylece $'\x22'
değişmez olarak değil, özel olarak yorumlanır.
Ve ifadenin ikinci kısmı için sadece kullanamazsınız -o
, olmak zorunda -oE
.
Çünkü +
parçası ERE
, Ve olmadan -E
, bu sadece BRE
. Düşünüyor +
değişmez.
Kanıt +
kelimenin tam anlamıyla orada .. 55.55.55.55 eşleşmiyor ama bu olacak:
$ echo 3+.3+.3+.3+ | grep -o [0-9]+\.[0-9]+\.[0-9]+\.[0-9]+
3+.3+.3+.3+
Demek işte aldığın hat ama ayarladın.
Bash'in tırnak kullanmak yerine ASCII kodlarını genişletme özelliğini kullanma. Tırnakları ilk bölümden çıkarma ve ekleme -E
ikinci bölüm için:
$ grep -o ProductVersion$'\x22'.*$'\x22'.*$'\x22' foo.txt | grep -oE [0-9]+\.[0
-9]+\.[0-9]+\.[0-9]+
59.59.140.59
KATMA
Değiştirirseniz [0-9]+
ile [0-9][0-9]*
(Aynı olan), daha sonra grep kullanabilirsiniz -E
.
Kullanabilirsiniz grep -P
ve sonra kullanabilirsiniz \d
için [0-9]
, ancak ikinci bölümün etrafında tırnak kullanmak zorundasınız. Veya \\d
.
Aslında, işte orjinal probleminizi tamamen çözen harika bir çözüm .. Sadece problemli bit için bir alıntı yapmanız yeterli. (Bu arada, ikinci yarıdaki normal ifadeyi tekrarlama operatörünü kullanarak daha verimli hale getirebilirim, ancak bu konu üzerinde durduğum alıntılarla ilgili olduğumuz konu ile ilgili değil).
Bu çalışıyor. Tek tırnakların ilk bitten bırakılması ve kullanılması \"
onları gerçek ifadeler yapmak için. Bu, tek bir alıntı yapılması gereken çifte alıntı hatalarını yuvarlar. (Windows NT'lerde eğer garip hata findstr
Şüphesiz tek bir alıntı ile olmasa da, buna benzer bir şey vardır.)
grep -P
ikinci bölümde kullanmamıza izin veriyor \d
. İkinci yarıda normal ifadenin etrafına tırnak koyabiliriz. Ya da sadece etrafına tırnak koyabiliriz '\d\
veya yaptığım ve kullandığım kadar yapabiliriz \\d.
( \d
Yalnız -şanslı ve alıntılanmamış, eşleşmeyecek çünkü Bash tarafından yorumlanır ve d
ne zaman grep
anladım.)
$ grep -o ProductVersion\".*\".*\" foo.txt | grep -oP \\d+\.[0-9]+\.[0-9\]+\.[0
-9]+
59.59.140.59
Şimdi teklif sorunuyla ilgilendiğimize göre, tekrarlama operatörü ile daha verimli hale getireceğim. Düzenli ifadesi 3{4}
anlamına geliyor 3333
. Düzenli ifadesi (fg){4}
anlamına gelir fgfgfgfg
.
$ grep -o ProductVersion\".*\".*\" foo.txt | grep -P '(\d.){4}'
ProductVersion" Value="59.59.140.59""
$ grep -o ProductVersion\".*\".*\" foo.txt | grep -P '('\\d.')'{4}
ProductVersion" Value="59.59.140.59""
$ grep -o ProductVersion'"'.*'"'.*'"' foo.txt | grep -P '('\\d.')'{4}
ProductVersion" Value="59.59.140.59""