无法替换我的正则表达式匹配项

无法替换我的正则表达式匹配项

我可以过滤文件,我可以流式传输我的正则表达式的匹配...但是,我需要从大文件中删除它。

正则表达式:^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$

sed -e '/^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/d/ /g' file 

仅流式传输匹配项,但不会替换/剪切它们。

我可以搜索包含匹配项的文件,也可以。

让它发挥作用的公式是什么?

答案1

看来您正在使用 Perl 兼容的正则表达式 (PCRE) 和sed.默认情况下,该sed实用程序仅识别基本正则表达式 (BRE)(或在大多数系统上使用时,识别扩展正则表达式 (ERE) -E)。

我也不认为sed语法是正确的,但很难阅读,因为问题中的表达式似乎有额外的*内容。您似乎想要删除电子邮件中的多部分分隔符,但您似乎并不关心如何正确匹配它们(将一个多部分部分的开头与相应的结束分隔符匹配)。如果sed语法得到更正,表达式可能会删除电子邮件的全部内容,或将所有附件合并到消息正文中。

PCRE 表达

^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$

与 ERE 相同(与 一起使用sed -E

^([A-Za-z0-9+/]{4})*([A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3})?=$

并使用它(您似乎正在这样做)来删除这些行,但命令中的d尾随是一个错误。删除可能会将所有附件合并到电子邮件正文中。/ /gsed/ /g

如果您想删除电子邮件的附件(如评论中指出),我不会尝试sed使用正确的电子邮件解析器来做到这一点。

有关如何执行此操作的示例可以在以下相关问题中找到:

就我个人而言,我会编写一个类似于上面第一个链接的问题/答案中的 Perl 脚本。请记住始终在以下位置运行此类脚本的测试运行副本您的邮箱,以防万一您出错。

邮件fdm工具可以筛选基于附件的数量和/或大小的消息,这可能是一种方便的从存档邮箱中过滤掉大电子邮件的方法。

答案2

尝试:

sed -E "s/^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$//g" file

并仔细检查输出。必须-E是资本。-e不起作用。

一旦确定它有效,请-iE直接使用文件进行更改

相关内容