将与模式匹配的行移至文件顶部(多个文件)

将与模式匹配的行移至文件顶部(多个文件)

我有一个包含大约 4000 个文本文件的文件夹,每个文件都包含一封电子邮件及其标题。我想将文件夹中的所有文件转换为一个.mbox文件,但要做到这一点,我需要每封电子邮件的标题From作为文件的第一行。

我认为要做到这一点,我需要使用类似awk或的东西,sed但我不知道如何做。有没有人有任何建议或指南可以让我完成这个任务?

答案1

要将电子邮件 ID 作为文件的标题或第一行,请使用以下命令来实现相同的目的:

find . -type f -iname "*.txt"  -exec sed  '1i emailid' {} \;

上面的命令将插入电子邮件 ID 作为每个文件格式为 .txt 的文件的第一行。

答案2

您可以循环遍历文件并使用ed。命令ed是:

ed -s input <<< $'/^From .*@/m0\nw\nq'

input这会编辑以脚本模式 ( )命名的文件,-s以在保存和退出时抑制字节的打印。这里的字符串<<< $' ... '将命令发送到ed其标准输入。这些命令指示 ed 查找以字符串开头、From后跟任何内容、后跟@;的行。在该行上,执行move 命令并将其放在第 0 行之后——使其成为新的第一行。然后w将文件写回到磁盘并q退出。

剩下的就是使用一些 shell 通配符和循环来循环文件for;例如:

for file in ./*.txt
do
  ed -s "$file" <<< $'/^From .*@/m0\nw\nq'
done

这会就地编辑您的文件,因此请处理备份副本,直到您对结果感到满意为止。

/^From .*@/如果您的数据支持,您可以收紧正则表达式搜索模式;也许可以通过添加对日期字符串存在的要求或对电子邮件地址中存在一定数量的子域的要求等。

有关的更多信息ed,请安装它并运行man edinfo ed;或检查ed 的在线手册页

答案3

感谢@Kusalananda,成功地使用formail.

cat `find . -type f -name '*' -print` | formail -es > ../result.mbox

相关内容