如何使用SED搜索和替换xml文件中的文本?

时间:2011-12-22 23:14:28

标签: bash sed

我必须将文件夹中的xml文件列表从UTF-16转换为UTF-8,删除BOM,然后将文件中的关键字从UTF-16替换为UTF-8。

我正在使用cygwin来运行一个bash shell脚本来完成这个,但是我从来没有在今天之前使用过SED,我需要帮助!

我发现了一个用于删除BOM的SED单线程,现在我需要另一个用于将文本从UTF-16替换为xml标题中的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

正在挂起脚本。关于适当格式的任何想法?

2 个答案:

答案 0 :(得分: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进行文件内更改以删除文本。

答案 1 :(得分:1)

2件事

  1. 你的$ f文件有多大,如果真的很大,可能需要很长时间才能完成。

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

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

    我希望这会有所帮助。