2011-12-22 79 views
0

我必须将文件夹中的xml文件列表从UTF-16转换为UTF-8,删除BOM,然后将文件中的关键字从UTF-16替换为UTF-8。如何使用SED搜索和替换xml文件中的文本?

我正在使用cygwin运行bash shell脚本来完成此操作,但在今天之前我从未使用过SED,因此我需要帮助!

我发现了一个用于删除BOM的SED单个内衬,现在我需要另一个用于在xml标题中将UTF-16替换为UTF-8的文本。

这是我到目前为止有:

#!/bin/bash 
mkdir -p outUTF8 

#Convert files to unix format. 
find -exec dos2unix {} \; 

#Use a for loop to convert all the xml files. 
for f in `ls -1 *.xml`; do 
    sed -i -e '1s/^\xEF\xBB\xBF//' FILE 
    iconv -f utf-16 -t utf-8 $f > outUTF8/$f 
    sed 's/UTF-16/UTF-8/g' $f > outUTF8/$f 
    echo $f 
done 

然而,这条线:

sed 's/UTF-16/UTF-8/g' $f > outUTF8/$f 

挂的脚本。任何想法,以适当的格式呢?

+0

你为什么不'sed'/ UTF-16/UTF-8/g'outUTF8/$ f'而不是'sed's/UTF-16/UTF-8/g'$ f > outUTF8/$ f' – 2011-12-22 23:27:33

+2

这不是唯一的问题,而是改变''ls -1 * .xml'中的f'; ''为f中的* .xlm'和'$ f'为'“$ f”' – 2011-12-22 23:29:09

+0

是的,我同意这将阻止它拆分其中有空格的文件。另外,'sed -i -e'1s/^ \ xEF \ xBB \ xBF //'FILE'我真的不知道'FILE'是什么,它的目的是什么? – 2011-12-22 23:53:39

回答

2

尝试这样的事情 -

for filename in *.xml; do 
    sed -i".bak" -e '1s/^\xEF\xBB\xBF//' "$filename" 
    iconv -f utf-16 -t utf-8 "$filename" > outUTF8/"$filename" 
    sed -i 's/UTF-16/UTF-8/g' outUTF8/"$filename" 
done 

第一sed会让你的原始文件的备份与扩展.bak。然后它将使用iconv转换文件并将其保存在具有相同文件名的新创建的目录下。最后,您将使用sed进行文件更改以删除文本。

+0

好吧,一切都快成效了。我在文件头中仍然有<?xml version =“1.0”encoding =“utf-16”?>。我需要它是<?xml version =“1。0“encoding =”utf-8“?>,因为这是文件被转换成的格式。脚本不再挂起,它仍然运行到最后。 – 2011-12-27 16:22:13

+0

在最后的'sed'行尝试使用小写字母,即使用这个'sed -i's/utf-16/utf-8/g'outUTF8 /“$ filename”' – 2011-12-27 16:25:03

+0

我拿出所有的大写字母并且做成了:sed -i's/UTF-16/UTF-8/g'out /“$ filename”,但它仍然没有替换文本,我检查了文件属性并且没有权限问题 – 2011-12-27 16:58:54

1

2东西

  1. 你有多大的$ F文件,如果它真的非常大,它可能只是需要长时间才能完成。

  2. Opps,我看到你的循环底部有一个echo $f。在sed命令之前移动它,以便查看文件名中是否有空格。

2a :-)。或者只是将所有对$f的引用更改为"$f"以防止出现空格。

我希望这会有所帮助。

+0

如果文件名中有空格,则for循环在此形状中也会失败。 – 2011-12-22 23:28:01

+0

最大的是88kb。 – 2011-12-22 23:42:11

+0

好吧,大小看起来不像是问题。你的文件名有空格吗? @JaypalSingh看起来有我们所有的当前问题。这是否解决您的问题,或者您的代码仍然挂起?祝你好运。 – shellter 2011-12-23 01:30:26