我正在尝试采用 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。任何帮助都会很棒。
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
-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'
perl -0pe 's/search/replace/gms' file
有时作为解决方法,这也可能会有所帮助:
str=$(grep -Poh "pcre-pattern" file)
sed -i "s/$str/$something_else/" file
-o,--仅匹配: 仅打印匹配行的匹配(非空)部分,每个此类部分位于单独的输出行上。