2

请参阅下面的更新。

我正在尝试强制更新一些日文电子邮件文件的代码页。这些文件被标记为 UTF-8,但日文文本未正确表示。我需要将标头中的编码从“UTF-8”更改为“shift-jis”。

我已经手动检查了这个工作,但我想自动化这个过程。使用两个 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--

在文件的循环中运行上述两个命令似乎可行,但我需要确保由于其余电子邮件的内容而仅更改文件的标题和紧随其后的字符集变量。

我制作的伪代码如下:

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”字符串的外循环(标签:a和分支命令)和一个在进行标题替换后运行的内循环(标签和分支命令)。内部循环寻找“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 回答