对于每个文件:逐行走路,grep走线路(输出不正确)

时间:2012-05-16 18:33:52

标签: string bash text sed cat

请参阅下面的更新。

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

在文件循环中运行上述两个命令似乎有效,但我需要确保只有文件的标题和之后的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 =代码的其他实例,那么它应该没问题。

2 个答案:

答案 0 :(得分:1)

这样做你想要的吗?

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

这会将替换应用于从开头开始的每一行,直至并包括与您的条件匹配的第一行。在该行之后,不再应用替换,仅具有修改符合条件的第一行的净效果。

答案 1 :(得分: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替换它。