2012-05-16 57 views
2

请参阅下面的更新。对于每个文件:一行一行,一个字符串grep(错误输出)

我试图强制更新一些日文电子邮件文件的代码页。这些文件被标记为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 

我beleive我可以做必要的改革。 由于电子邮件的内容,我需要将其限制为仅更改电子邮件的标头。我看到作为标准的格式如下:

From: "=?UTF-8?Q?JapaneseNameEncodedIncorreclty" <[email protected]> 
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语句第一子句进一步的问题是,“字符集=”可能已应用串不编码,它可能是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 

它没有考虑到占头,而是提供有在电子邮件中的字符集=代码没有其他情况下,那么它应该没问题。

+1

将'grep'配置为'echo'根本没有任何意义('echo'不会从stdin读取任何内容)。你能告诉我们一些输入和你期望输出的样子吗? – larsks

+0

你可以减少整个事情到'grep“字符集=”*'? –

+0

我对语法不是很熟悉。将grep配置为echo会尝试显示结果正确的字符串。我试图单独使用grep语句无济于事。我会尽快发布我的结果。感谢您帮助球员。 –

回答

1

这是做你想做的吗?

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

这将替换应用于从开始处开始的每行,直到并包括符合条件的第一行。在该行之后,替换不再适用,只会修改符合条件的第一行。

+0

这有帮助。我需要使用模式匹配作为布尔匹配来允许编辑中断。我以为grep可能会诀窍,我可以使用sed打印出所有匹配的实例,但使用它只打印出第一个实例已证明非常棘手。 –

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”。有一个外部循环(标签:a和分支命令ba)查找“header_old”字符串和一个内部循环(标签:b和分支命令bb),一旦进行标题替换就运行。内循环寻找“other_old”。模式必须按照该顺序和单独的行显示。

n命令从文件中读取下一行。 /pattern1/s//pattern2/搜索包含pattern1的行,并且空的一对斜杠重新使用该模式并将其替换为pattern2

相关问题