Регулярное выражение PCRE в SED

Я пытаюсь взять PCRE regex и использовать его в SED, но у меня возникают некоторые проблемы. Обратите внимание, что этот вопрос представляет большую проблему (как преобразовать регулярное выражение PCRE для работы с SED), поэтому вопрос не просто о приведенном ниже примере, а о том, как использовать регулярное выражение PCRE в регулярном выражении SED в целом.

в этом примере извлекается адрес электронной почты из строки и заменяется на " [emailaddr]".

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

Я пробовал следующую замену регулярное выражение:

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

Я попытался изменить разделители sed с s/find/replace|g на s|find|replace / g, как описано здесь (переполнение стека: регулярное выражение pcre в регулярное выражение sed).

Я все еще не могу понять, как использовать PCRE regex в SED или как конвертировать PCRE regex в SED. Любая помощь будет большое.

3 ответов


использовать -r флаг, позволяющий использовать расширенные регулярные выражения. ( -E вместо -r on OS X )

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

Ideone Demo


GNU sed использует базовые регулярные выражения или с -r флаг расширенные регулярные выражения.

ваш regex как спецификация базовых регулярных выражений (спасибо mklement0):

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

обратите внимание, что это выражение будет не сопоставьте все адреса электронной почты (не на Большой выстрел).


хочу PCRE (P erl Compatible Regular Expressions с широким ассортиментом)? Почему бы вам не использовать ?

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

выход:

My email is [emailaddr]

записать вывод в файл с помощью tee:

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