Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
对于每个文件:逐行遍历和grep For string(输出不正确)_String_Bash_Text_Sed_Cat - Fatal编程技术网

对于每个文件:逐行遍历和grep For string(输出不正确)

对于每个文件:逐行遍历和grep For string(输出不正确),string,bash,text,sed,cat,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 我相信我

请参阅下面的更新

我正试图强制更新一些日文电子邮件文件的代码页。文件标记为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=的第一个实例,然后更改字符串以添加或替换“”后面的“”中的字符

我目前遇到问题的代码如下所示(请原谅我对语法掌握不好)

感谢您迄今为止的所有投入。非常感谢

编辑:我有一个解决办法

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

done

它不考虑标题,但如果电子邮件中没有其他charset=代码实例,则应该可以

这是你想要的吗

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

这会将替换应用于从开头开始的每一行,直到并包括符合条件的第一行。行之后,将不再应用替换,其净效果是仅修改符合您标准的第一行。

您可能会发现这很有用,但您需要让我知道标题替换的要求,以便我可以更改命令以匹配

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\u old”和第一次出现的“other\u old”。有一个外循环(label
:a
和branch命令
ba
)查找“header\u old”字符串,还有一个内循环(label
:b
和branch命令
bb
),在更换header后运行。内部循环查找“其他旧”。图案必须按该顺序显示在单独的行上


n
命令读取文件的下一行
/pattern1/s//pattern2/
搜索包含
pattern1
的行,空斜杠对重用该模式并替换
pattern2

grep
导入
echo
没有任何意义(
echo
没有从stdin读取任何内容)。你能告诉我们一些输入和你期望的输出是什么样子吗?你能把整个事情简化成
grep“charset=“*
”吗?我对语法不是很熟悉。将grep管道化到echo是一种试图显示结果正确的字符串的尝试。我试过单独使用grep语句,但没有效果。我将尽快发布我的跑步结果。谢谢你们的帮助,“逃避”这个词对你们的要求是错误的。“退出”(或“中断”,正确使用)可能更正确。这很有帮助。我需要将模式匹配基本上用作布尔匹配,以允许从编辑中断。我认为grep可能会这样做,我可以使用sed打印出一个匹配的所有实例,但使用它只打印出第一个实例被证明是很棘手的。
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