我正在尝试使用PCRE正则表达式并在SED中使用它,但我遇到了一些问题.请注意,这个问题代表了一个更大的问题(如何将PCRE正则表达式转换为与SED一起使用)所以问题不仅仅是关于下面的示例,而是关于如何在SED正则表达式中使用PCRE正则表达式作为一个整体.
此示例从一行中提取电子邮件地址,并将其替换为"[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'
Run Code Online (Sandbox Code Playgroud)
我试过以下替换正则表达式:
([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}
Run Code Online (Sandbox Code Playgroud)
我已经尝试将sed的分隔符从s/find/replace/g更改为s | find | replace | g,如此处所述(堆栈溢出:pcre regex到sed regex).
我仍然无法弄清楚如何在SED中使用PCRE正则表达式,或者如何将PCRE正则表达式转换为SED.任何帮助都会很棒.
hwn*_*wnd 19
使用-r标志启用扩展正则表达式.(-E而不是-r在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'
Run Code Online (Sandbox Code Playgroud)
Roc*_*ite 15
要PCRE(P ERL ç ompatible [R egular é Xpressions的)?你为什么不用perl?
perl -pe 's/[a-zA-Z0-9]+[@][a-zA-Z0-9]+[\.][A-Za-z]{2,4}/[emailaddr]/g' \
<<< "My email is abc@example.com"
Run Code Online (Sandbox Code Playgroud)
输出:
My email is [emailaddr]
Run Code Online (Sandbox Code Playgroud)
将输出写入文件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
Run Code Online (Sandbox Code Playgroud)
GNU sed使用基本正则表达式,或者使用-r标志扩展正则表达式.
您的正则表达式作为POSIX基本正则表达式(感谢mklement0):
[[:alnum:]]\{1,\}@[[:alnum:]]\{1,\}\.[[:alpha:]]\{2,4\}
Run Code Online (Sandbox Code Playgroud)
请注意,此表达式不匹配所有电子邮件地址(不是长镜头).