PCRE 正则表达式到 SED

问题描述 投票:0回答:5

我正在尝试采用 PCRE 正则表达式并在 SED 中使用它,但遇到了一些问题。请注意,这个问题代表了一个更大的问题(如何将 PCRE 正则表达式转换为与 SED 一起使用),因此问题不仅仅是关于下面的示例,而是关于如何在 SED 正则表达式中使用 PCRE 正则表达式作为一个整体。

此示例从一行中提取电子邮件地址,并将其替换为“[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'

我尝试了以下替换正则表达式:

([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 正则表达式更改为 sed 正则表达式)

我仍然无法弄清楚如何在 SED 中使用 PCRE 正则表达式,或者如何将 PCRE 正则表达式转换为 SED。任何帮助都会很棒。

regex sed pcre
5个回答
44
投票
想要PCRE(

PerlC兼容R常规Expressions)?为什么不使用 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
    

38
投票
使用

-r

 标志启用
扩展正则表达式。 (在 OS X
 上,用 
-E
 代替 
-r

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

Ideone 演示


10
投票
GNU sed 使用

基本正则表达式,或者使用 -r

 标志,
扩展正则表达式

您的正则表达式作为 POSIX 基本正则表达式(感谢 mklement0):

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

请注意,此表达式

不会匹配所有电子邮件地址(绝对不会)。


2
投票
对于多行使用 0!

perl -0pe 's/search/replace/gms' file
    

0
投票

有时作为解决方法,这也可能会有所帮助:

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

-o,--仅匹配: 仅打印匹配行的匹配(非空)部分,每个此类部分位于单独的输出行上。

© www.soinside.com 2019 - 2024. All rights reserved.