PCRE正则表达到SED

时间:2014-07-18 19:32:13

标签: regex sed pcre

我正在尝试使用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。任何帮助都会很棒。

5 个答案:

答案 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'

Ideone Demo

答案 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”文件