我可以过滤文件,我可以流我的正则表达式.但是,我需要从一个大文件中准确地删除它。
Regex:^(?:[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 只流匹配,但不替换/剪切匹配。
我可以搜索文件,包含匹配,也可以工作。
What是让它工作的公式?
发布于 2019-03-10 08:17:37
看来您使用的是与sed兼容的Perl兼容正则表达式(PCRE)。sed实用程序在默认情况下只知道基本正则表达式(BRE) (或在大多数系统中与-E一起使用时使用扩展正则表达式(ERE) )。
我也不认为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 (您似乎正在做的)来删除这些行,但是sed命令中的尾随/ /g是一个错误。删除/ /g可能会将所有附件合并到电子邮件的正文中。
如果您想删除电子邮件信息的附件(如评论中指出的),我不会尝试使用sed,而是使用适当的电子邮件解析器。
如何这样做的例子可以在以下相关问题中找到:
就我个人而言,我会编写一个Perl脚本,类似于上面第一个链接问题/答案中的脚本。请记住,在您的邮箱副本上始终运行此类脚本的测试运行,以防您出错。
fdm邮件工具能够根据附件的数量和/或大小过滤邮件,这对于过滤存档邮箱中的大型电子邮件可能非常方便。
发布于 2019-03-10 18:18:36
尝试:
sed -E "s/^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$//g" file再检查一遍输出。-E必须是资本。-e不工作。
一旦您确定它可以工作,则使用-iE直接对文件进行更改。
https://unix.stackexchange.com/questions/505419
复制相似问题