2014-07-18 13 views
9

Sto tentando di eseguire regex PCRE e utilizzarlo in SED, ma sto riscontrando alcuni problemi. Si noti che questa domanda è rappresentativa di un problema più grande (come convertire regex PCRE per lavorare con SED) quindi la domanda non è semplicemente circa l'esempio di seguito, ma su come utilizzare regex PCRE in regex SED nel suo complesso.PCRE Regex a SED

Questo esempio sta estraendo un indirizzo email da una linea e sostituendolo con "[emailaddr]".

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

ho provato la seguente espressione regolare sostituzione:

([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} 

Ho provato a cambiare il delimitato di sed da s/trovare/sostituire/ga s | ricerca | sostituire | g come descritto here (stack overflow: pcre regex to sed regex).

Non riesco ancora a capire come utilizzare l'espressione regolare PCRE in SED, o come convertire la regex PCRE in SED. Qualsiasi aiuto sarebbe grande.

+0

Si noti che '.' non è speciale in' [parentesi] ', in modo da non lo fai devi scappare: '[.]' sta bene. Inoltre, '@' non è speciale nelle espressioni regolari, quindi non è necessario metterlo tra parentesi (a meno che non ti piaccia il suo aspetto) –

+0

Grazie per il suggerimento. – Sugitime

+3

Solo un consiglio, sai che puoi usare perl in un modo molto simile a sed (sintassi saggio) e ovviamente supponiamo PCRE 'perl -pe '/ oldstring/newstring /'' – Tiago

risposta

13

Utilizzare il flag -r che consente l'utilizzo di extended regular expressions. (-E invece di -r su OS X)

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

I get ' sed: opzione illegale - r ' – Sugitime

+0

Nevermind, è solo una cosa strana per Mac. Funziona sulla mia macchina Linux così im set. Grazie mille! – Sugitime

+2

Sul Mac, vuoi '-E' invece: https://developer.apple.com/library/mac/documentation/Darwin/Reference/ManPages/man1/sed.1.html –

5

GNU sed usa basic regular expressions o, con la bandiera -r, extended regular expressions.

tuo regex come POSIX regex base (mklement0 grazie):

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

Si noti che questa espressione sarà non partita tutti gli indirizzi email (non da un colpo lungo).

+2

Poiché l'OP sembra anche usare OS X: nota che 'sed' lì (FreeBSD' sed') usa le espressioni regolari di base di _POSIX_, dove '\ +' e '\?' sono _not_ supportati - usa invece '\ {1, \}' e '\ {0,1 \}'. – mklement0

+0

Anche questo è bello sapere. Sono in una situazione difficile perché la mia macchina di sviluppo è OSX e la macchina di produzione è Linux .... Ma terrò a mente questo. Grazie – Sugitime

+0

@Sugitime: Se ti trovi a dover utilizzare regolarmente GNU 'sed' e FreeBSD' sed' regolarmente, ecco un riepilogo delle differenze: http://stackoverflow.com/a/24276470/45375 – mklement0

4

Vuoi PCRE (P Erl C ompatible R egular E Xpressions)? Perché non usi invece perl?

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

uscita:

My email is [emailaddr] 

Write output in un file con tee:

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