【问题标题】:How to search and replace text in an xml file with SED?如何使用 SED 搜索和替换 xml 文件中的文本?
【发布时间】:2011-12-22 23:14:27
【问题描述】:

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

我正在使用 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

正在挂起脚本。关于这个的正确格式有什么想法吗?

【问题讨论】:

  • 为什么不使用sed -i 's/UTF-16/UTF-8/g' outUTF8/$f 而不是sed 's/UTF-16/UTF-8/g' $f > outUTF8/$f
  • 这不是唯一的问题,而是将for f in `ls -1 *.xml`; do 更改为for f in *.xlm$f 更改为"$f"
  • 是的,我同意这将阻止它拆分包含空格的文件。另外,sed -i -e '1s/^\xEF\xBB\xBF//' FILE 我真的不知道FILE 是什么,它的目的是什么?
  • 文件不应该在那里。我把它拿出来了。

标签: bash sed


【解决方案1】:

试试这样的 -

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 进行文件内更改以删除文本。

【讨论】:

  • 好吧,一切都差不多了。我仍然有 在文件的标题中。我需要它是 因为这是文件转换成的内容。脚本不再挂起,它一直运行到最后。
  • 尝试在sed的最后一行使用小写,即使用sed -i 's/utf-16/utf-8/g' outUTF8/"$filename"
  • 我把所有的大写字母都去掉了:sed -i 's/UTF-16/UTF-8/g' out/"$filename",但它仍然没有替换文本。我检查了文件属性,没有权限问题。
  • sed 区分大小写。因此,如果您打算替换的文本是小写的,即utf-16,那么sed 脚本应该在命令中使用小写。或者您可以在g 之前添加i 以使替换不区分大小写。
  • 或者,您也可以在转换文件之前进行 sed 替换。
【解决方案2】:

两件事

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

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

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

我希望这会有所帮助。

【讨论】:

  • 如果文件名中有空格,这种形状的 for 循环也会失败。
  • 好的,所以尺寸似乎不是问题所在。你的文件名中有空格吗? @JaypalSingh 看起来有我们当前的所有问题。这能解决您的问题还是您的代码仍然挂起。祝你好运。
  • 文件名没有空格,但都包含破折号和下划线。
  • 所以,它还在“挂起”吗?您是否尝试在脚本顶部使用set -vx 来查看每一行的扩展。尝试在文件名类似于 sed -i".bak" -e '1s/^\xEF\xBB\xBF//' -- $filename 之前挂起的 sed 行上添加 -- 。祝你好运。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-10-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-08
  • 2011-07-13
  • 1970-01-01
相关资源
最近更新 更多