Grep

2011-02-16 4 views
5

ile bir regex'in son karakteri nasıl yakalanır Son boşluğu yakalamaya çalışıyorum ve grep kullanarak bir çizgide onu takip ediyorum.Grep

Bu bana ilk alan yakala:

Ben olmayan açgözlü operatörü kullanılmış olurdu ama işe görünmüyor Java'da
echo "toto tata titi" | grep -o " .*$" 

:

echo "toto tata titi" | grep -o " .*?$" 

Hiçbir şey

dönmek

Beklenen sonuç titi.

cevap

6

.'u [^ ] ile değiştirin; O zaman açgözlü olabilir.

echo "toto tata titi" | grep -o " [^ ]*$" 

(Eğer grep genişletilmiş Regexes kullanmak ya egrep veya grep -E kullanmak istiyorsanız.)

+0

Sizin düzenli ifadeniz yapmak istediğimi yapar, teşekkürler. Ama biliyormusun benim neden bile -E ile çalışmıyor? – JPB

+0

@ Jean-Philippe: Normal ifade, konu dizgisine soldan sağa doğru uygulandığından, ilk boşlukta başlar, yavaş yavaş sonuna kadar genişler ve böylece başarılı olur. Başka pozisyonları denemeye gerek yok. –

+0

@Jean: '/. *? $ /' Eşleşmesi önce alanı bulur ve oradan eşleşmeye başlar. Dize sonuna kadar eşleşir ve yapılır. Tereddütsüzlük, sadece tercümanın mevcut birimi ('.') aramaya devam edip etmemeye karar vermesi ya da bir sonraki ile eşleşmesi gerektiğinde devreye girer. En kısa çözümü bulana kadar _not_ backtrack yapar. – Tim

1

DÜZENLEME: Sadece bu yazı için daha iyi bir cevap gördüm, ama yine de bu gönderme gibi olabilir Bir şeyleri değiştirmek gibi daha karmaşık bir şey yapmak istiyorsanız yardımcı olabilirsiniz.

:

olarak bunu yapmanın başka bir yolu da sed komutunu kullanın ve parantez değişken \1 toplanır hangi (İstediğin olanı hariç her şeyi (regex ilk s komutuyla) yerine izin vermektir Temelde

echo "toto tata titi" | sed -r "s/.*(.*?)$/\1/" 
1

, ne geçen alanının ilk karakteri oluyor yapıyoruz. regex daha cana yöntem alanlara dizeleri ayırabilirsiniz bir araç kullanarak ve yapıyor "alt dize-ing".

$ echo "toto tata titi" | awk '{print substr($NF,0,1)}' 
t 


$ echo "toto tata titi" | ruby -ane 'puts $F[-1][0]' 
t