2014-07-18 20 views
9

PCRE regex'i kullanmaya ve SED'de kullanmaya çalışıyorum, ancak bazı sorunlara rastlıyorum. Lütfen bu sorunun daha büyük bir konunun (SUE ile çalışmak için PCRE regex'ini nasıl dönüştürdüğüne dair) olduğunu unutmayın, bu nedenle soru sadece aşağıdaki örnekle ilgili değildir, fakat SUE regex'inin bütün olarak PCRE regex'inin nasıl kullanılacağı ile ilgilidir.PCRE Regex to SED

Bu örnek, bir e-posta adresini bir satırdan ayıklamak ve "[emailaddr]" ile değiştirmektir. | Bulabilirsiniz | yerini | g özetlendiği gibi

([a-zA-Z0-9]+[@][a-zA-Z0-9]+[\.][A-Za-z]{2,4}) 
[a-zA-Z0-9]+[@][a-zA-Z0-9]+[\.][A-Za-z]{2,4} 
([a-zA-Z0-9]+[@][a-zA-Z0-9]+[.][A-Za-z]{2,4}) 
[a-zA-Z0-9]+[@][a-zA-Z0-9]+[.][A-Za-z]{2,4} 

ben s// g ila lar bul/değiştir gelen sed ayrılmış değişen denedim:

echo "My email is [email protected]" | sed -e 's/[a-zA-Z0-9]+[@][a-zA-Z0-9]+[\.][A-Za-z]{2,4}/[emailaddr]/g' 

ben yerine aşağıdaki regex denedim here (stack overflow: pcre regex to sed regex).

SED'deki PCRE regex'ini nasıl kullanabileceğinizi veya PCRE regex'in SED'ye nasıl dönüştürüleceğini hala öğrenemiyorum. Herhangi bir yardım harika olurdu.

+0

Not kaçmak zorunda: '[.]' iyidir. Ayrıca, '' 'düzenli ifadelerde hiç de özel değildir, bu yüzden parantez içine koymanıza gerek yoktur (göründüğü gibi değil) –

+0

Bahşiş için teşekkürler. – Sugitime

+3

Sadece bir ipucu, perl'e çok benzer bir şekilde sed sözcüğünü (sözdizimi) kullanabileceğinizi biliyorsunuz ve tabii ki PCRE 'yi destekliyor perl -pe'/oldstring/newstring/'' – Tiago

cevap

13

extended regular expressions kullanımını etkinleştiren -r bayrağını kullanın. GNU sed

echo "My email is [email protected]" | sed -r 's/[a-zA-Z0-9][email protected][a-zA-Z0-9]+\.[A-Za-z]{2,4}/[emailaddr]/g' 

Ideone Demo

+0

'dan aldığım bir program (sed değil) yazılmıştır. sed: yasadışı seçeneği - r ' – Sugitime

+0

Nevermind, bu sadece bir tuhaf Mac şey. Benim linux box'ım üzerinde çalışıyor. Çok teşekkür ederim! – Sugitime

+2

Mac'te, '-E' yerine şunu yerine getirmelisiniz: https://developer.apple.com/library/mac/documentation/Darwin/Reference/ManPages/man1/sed.1.html –

5

-r bayrak, extended regular expressions ile basic regular expressions kullanan veya (-E yerine -r OS Xüzerine). Bir POSIX temel regex (teşekkürler mklement0) olarak

Sizin regex:

[[:alnum:]]\{1,\}@[[:alnum:]]\{1,\}\.[[:alpha:]]\{2,4\} 

Not bu ifadesi olacak değil maçı (değil uzun bir atış) tüm e-posta adresleri.

+2

gerektiriyor, bu yana yanıltıcı bir sorundur çünkü OP de OS X kullanmak gibi görünüyor: 'sed' orada var olduğunu (FreeBSD 'sed') _POSIX_ temel regex kullanır,' '+ + ve '\?' _not_ desteklenir - bunun yerine '\ {1, \}' ve '\ {0,1 \} kullanın. – mklement0

+0

Bu da bilmek güzel. Zor bir noktadayım çünkü dev makinem OSX ve prod makinesi linux ... Ama bunu aklımda tutacağım. Teşekkürler – Sugitime

+0

@Sugitime: Eğer düzenli olarak GNU 'sed' ve FreeBSD' sed' kullanmak zorunda kalıyorsanız, farkların bir özeti: http://stackoverflow.com/a/24276470/45375 – mklement0

4

PCRE'yi (P erl ompatible R egular e Xpressions) ister? Bunun yerine neden perl kullanıyorsunuz?

perl -pe 's/[a-zA-Z0-9]+[@][a-zA-Z0-9]+[\.][A-Za-z]{2,4}/[emailaddr]/g' \ 
    <<< "My email is [email protected]" 

Çıktı: tee bir dosyaya

My email is [emailaddr] 

Yaz çıkışı: .` değil mi `[parantez]`, bu yüzden de özel değil `o

perl -pe 's/[a-zA-Z0-9]+[@][a-zA-Z0-9]+[\.][A-Za-z]{2,4}/[emailaddr]/g' \ 
    <<< "My email is [email protected]" | tee /path/to/file.txt > /dev/null