Ответ 1
Используйте флаг -r
, позволяющий использовать расширенные регулярные выражения. (-E
вместо -r
на 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'
Я пытаюсь использовать регулярное выражение 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. Любая помощь будет отличной.
Используйте флаг -r
, позволяющий использовать расширенные регулярные выражения. (-E
вместо -r
на 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'
Требуется 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
GNU sed использует базовые регулярные выражения или, с флагом -r
, расширенные регулярные выражения.
Ваше регулярное выражение в качестве основного регулярного выражения POSIX (спасибо mklement0):
[[:alnum:]]\{1,\}@[[:alnum:]]\{1,\}\.[[:alpha:]]\{2,4\}
Обратите внимание, что это выражение не будет соответствовать всем адресам электронной почты (не в долгосрочной перспективе).
Иногда это может быть полезно в качестве обходного пути:
str=$(grep -Poh "pcre-pattern" file)
sed -i "s/$str/$something_else/" file
-o, - -o nly-match: печатать только совпадающие (непустые) части совпадающей строки, причем каждая такая часть находится на отдельной выходной строке.
для многострочного используйте 0! Файл perl -0pe s/search/replace/gms