PCRE Regex to SED

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

В этом примере вы извлекаете адрес электронной почты из строки и заменяете его "[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'

Я попробовал следующее выражение regex:

([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 regex в sed regex ).

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

Ответ 2

Требуется PCRE ( P erl C ompatible R egular E xpressions)? Почему бы вам не использовать perl?

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

Вывод:

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 [email protected]" | tee /path/to/file.txt > /dev/null

Ответ 3

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

Ваше регулярное выражение в качестве основного регулярного выражения POSIX (спасибо mklement0):

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

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

Ответ 4

Иногда это может быть полезно в качестве обходного пути:

str=$(grep -Poh "pcre-pattern" file)
sed -i "s/$str/$something_else/" file

-o, - -o nly-match: печатать только совпадающие (непустые) части совпадающей строки, причем каждая такая часть находится на отдельной выходной строке.

Ответ 5

для многострочного используйте 0! Файл perl -0pe s/search/replace/gms