2

更新については、以下を参照してください。

日本語のメールファイルのコードページを強制的に更新しようとしています。ファイルにはUTF-8のフラグが付けられていますが、日本語のテキストが正しく表示されていません。ヘッダーのエンコーディングを「UTF-8」から「shift-jis」に変更する必要があります。

これが手動で機能することを確認しましたが、このプロセスを自動化したいです。2つのsedコマンドの使用:

#sed -i 's/charset="shift-jis"/charset="shift-jis"/g' $VariableForLine
#sed -i 's/?UTF-8?/?shift-jis?/g' $VariableForLine

必要な変更を加えることができると信じています。メールの内容により、メールのヘッダーのみを変更するように制限する必要があります。私が標準として見ているフォーマットは次のとおりです。

From: "=?UTF-8?Q?JapaneseNameEncodedIncorreclty" <ono.koj@jpm.com>
To: "Yoshi Endo"
Subject: =?UTF-8?Q?????????????????=view=?UTF-8?Q????????????????
MIME-Version: 1.0
Date: Wed, 20 Feb 2006 10:30:22 0100
Content-Type: multipart/alternative;boundary="Next_Item:_(A3CB49KFSA19)/1"

This is a multi-part message in MIME format.

--Next_Item:_(A3CB49KFSA19)/1
Content-type: text/plain; charset="UTF-8"

?UTF-8?(example to skip)

Ÿž=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-Ÿž
       Japanese Content        
Ÿž=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-Ÿž

?UTF-8? (example to skip)

ここには、ログインしてください
----------------------------------------------------------------
Mixed content
***************************************************************************
Mixed content 
***************************************************************************
--Next_Item:_(A3CB4g7FSA19)/1--

上記の2つのコマンドをファイルに対してループで実行することは機能しているように見えますが、残りの電子メールの内容のために、ファイルのヘッダーと直後のcharset変数のみが変更されていることを確認する必要があります。

私が作成した擬似コードは次のとおりです。

for each file in directory of type eml
do 
read file line by line
if line contains "charset=" replace with ??
break
else
if line contains ?UTF-8?
replace ?UTF-8? with ?shift-jis'
exit

ifステートメントの最初の句に関するさらなる問題は、 "charset ="文字列にエンコーディングが適用されていない可能性があることです。UTF-8またはANSIである可能性があるため、charset =の最初のインスタンスを検索してから、文字列を変更する必要があります。後に続く「」内の文字を追加または置換します。

私が現在問題を抱えているコードを以下に示します(構文の理解が不十分なことをお許しください)

#!/bin/bash
for file in ./*
do
   cat $file | while read myline 
    do 
       if $myline |grep "charset="
       then    
           echo $myline
           #echo $myline #this prints all the content
       fi
      done
             #sed -i 's/charset="shift-jis"/charset="shift-jis"/g' $LINE
             #sed -i 's/?UTF-8?/?shift-jis?/g' $LINE
done #end 

これまでのすべての入力に感謝します。とても有難い。

編集:私は解決策を持っています

for file in `find ./ | grep .EML`
do 
        sed  -i  's/charset=".*"/charset="shift-jis"/' $file
        sed  -i  's/?UTF-8?/?shift-jis?/' $file

done

ITはヘッダーを考慮しませんが、電子メールにcharset =コードの他のインスタンスがない場合は、問題ありません。

4

2 に答える 2

1

これは参考になるかもしれませんが、一致するようにコマンドを変更できるように、ヘッダー置換の要件を教えていただく必要があります。

for file in ./*
do
    if [[ -f $file ]]
    then
        sed -i '/header_old/{s//header_new/;:a;n;/other_old/{s//other_new/;:b;n;bb;};ba}' "$file"
    fi
done

これは、「header_old」の最初の出現と「other_old」の最初の出現を置き換えます。「header_old」文字列を検索する外側のループ (label and branch command ) と、ヘッダーの置換が行われると実行される内側のループ (label and :abranch command ) があります。内側のループは「other_old」を探します。パターンは、この順序で別々の行に表示する必要があります。ba:bbb

このnコマンドは、ファイルから次の行を読み取ります。/pattern1/s//pattern2/を含む行を検索しpattern1、空のスラッシュのペアはそのパターンを再利用して置き換えpattern2ます。

于 2012-05-17T03:01:08.237 に答える
1

これはあなたが望むことをしますか?

sed '0,/charset=/s/old/new/' $file

これにより、最初から基準に一致する最初の行まで、各行に置換が適用されます。行の後では、置換は適用されなくなり、基準に一致する最初の行のみを変更するという最終的な効果があります。

于 2012-05-16T18:43:48.597 に答える