我可以过滤文件,我可以流式传输我的正则表达式的匹配...但是,我需要从大文件中删除它。
正则表达式:^(?:[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
尾随是一个错误。删除可能会将所有附件合并到电子邮件正文中。/ /g
sed
/ /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
直接使用文件进行更改