Регулярное выражение 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'
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