パターンに一致する行をファイルの先頭に移動する(複数のファイル)

パターンに一致する行をファイルの先頭に移動する(複数のファイル)

約4000のテキストファイルを含むフォルダがあり、各ファイルには電子メールと件名が含まれています。フォルダ内のすべてのファイルを1つのファイルに変換したいが、これを.mbox行うには、Fromファイルの最初の行に各電子メールのヘッダーが必要です。

awkこれを行うには、orのようなものを使うべきだと思いますが、sedどうすればいいかわかりません。これを行う方法について提案やガイドがある人はいますか?

答え1

メールIDをファイルのヘッダーまたは最初の行として使用するには、次のコマンドを使用して同じ結果を得ます。

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

上記のコマンドは、.txt形式のすべてのファイルの最初の行に電子メールIDを挿入します。

答え2

ファイルを繰り返し見ることができ、Edを使う。コマンドは次edのとおりです。

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

inputこれは、スクリプトモード()で名前付きファイルを編集し、保存-sおよび終了時にバイト印刷を抑制します。ここの文字列は<<< $' ... 'コマンドをed標準入力に送信します。このコマンドは、edに文字列で始まり、Fromその後に何か@;が続く行を見つけるように指示します。その行でmove コマンドを実行し、0 行目の後に配置して新しい最初の行にします。その後、wファイルをディスクに書き戻してq終了します。

残りはシェルワイルドカードとループを使用してファイルを繰り返すことですfor

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

これにより、ファイルがその場所で編集されるため、結果に満足するまでバックアップコピーを操作してください。

/^From .*@/データがこれをサポートしている場合は、日付文字列の要件や電子メールアドレスに特定の数のサブドメインの要件などを追加して、正規表現検索パターンを強化できます。

詳細については、edインストール後man edまたはを実行info edまたは確認してください。edのオンラインマニュアルページ

答え3

@Kusalananda ありがとうございます。正常に使用されましたformail

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

関連情報