PCRE正则表达到SED

Sug*_*ime 14 regex pcre sed

我正在尝试使用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而不是-rOS 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)

Ideone演示

  • -1和@AlexHall不是它们不是同一个东西,这个答案是误导性的(因为没有在标题中解决PCRE)..在SED中不支持PCRE(我上次检查过).最多的SED支持是ERE(扩展...)(需要sed -r),没有-r它只是BRE(基本...).Sed不支持PCRE.Grep(使用-P),但不是sed.这个问题也有误导性,因为虽然标题是PCRE,但正则表达式只需要ERE (13认同)
  • 在Mac上,你需要`-E`代替:https://developer.apple.com/library/mac/documentation/Darwin/Reference/ManPages/man1/sed.1.html (3认同)
  • 请注意,`-E`也适用于GNU`sed'(作为`-r`的无证件别名). (3认同)

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)

  • @cherio,你认为 Perl 很慢吗?你做过任何测量吗?你不会注意到太大的不同。因为 Perl 很快。就像真的很快。 (3认同)

gle*_*man 9

GNU sed使用基本正则表达式,或者使用-r标志扩展正则表达式.

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

[[:alnum:]]\{1,\}@[[:alnum:]]\{1,\}\.[[:alpha:]]\{2,4\}
Run Code Online (Sandbox Code Playgroud)

请注意,此表达式匹配所有电子邮件地址(不是长镜头).

  • 由于OP似乎也使用OS X:注意`sed`那里(FreeBSD`sed')使用_POSIX_基本正则表达式,其中`\ +`和`\?`是_not_支持 - 使用`\ {1,\}和`\ {0,1 \}`而不是. (2认同)