我正在尝试使用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'
我已尝试过以下替换正则表达式:
([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,如概述here (stack overflow: pcre regex to sed regex)。
我仍然无法弄清楚如何在SED中使用PCRE正则表达式,或者如何将PCRE正则表达式转换为SED。任何帮助都会很棒。
答案 0 :(得分:15)
使用-r
标志启用extended regular expressions。 ( OS X )
-E
代替-r
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'
答案 1 :(得分:10)
想要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 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
答案 2 :(得分:6)
GNU sed使用basic regular expressions或使用-r
标记extended regular expressions。
你的正则表达式作为POSIX基本正则表达式(感谢mklement0):
[[:alnum:]]\{1,\}@[[:alnum:]]\{1,\}\.[[:alpha:]]\{2,4\}
请注意,此表达式将不匹配所有电子邮件地址(不是远景)。
答案 3 :(得分:0)
有时这也可能会有所帮助:
str=$(grep -Poh "pcre-pattern" file)
sed -i "s/$str/$something_else/" file
-o,--only-matching: 仅打印匹配行中匹配的(非空)部分,并将每个这样的部分打印在单独的输出行上。
答案 4 :(得分:0)
对于多行,请使用0! perl -0pe的“ s / search / replace / gms”文件