【问题标题】:Iterating through a file with old/new values and changing to new values in a separate file遍历具有旧/新值的文件并在单独的文件中更改为新值
【发布时间】:2020-11-07 02:50:25
【问题描述】:

我有一个 XML 文件,其中包含需要更改为新 ID 的旧 ID 列表。

例如:

<faketag>189852226</faketag>
<faketag>189851254</faketag>
<faketag>189851257</faketag>
<faketag>189851284</faketag>
<faketag>189851263</faketag>
<faketag>189851608</faketag>

我有另一个文件,其中包含旧 ID 和应该替换它们的新 ID。

old       new
189852226 192681118
189851254 192681121
189851257 192681124
189851284 192681127
189851263 192681130
189851608 192681133

遍历上述列表并将旧 ID 替换为 XML 文件中的新 ID 的最佳实践方法是什么?

谢谢

【问题讨论】:

  • 看看 xmlstarlet。这应该很简单(ish)
  • 同一个ID可以多行吗?
  • @RamanSailopal 是的,ID 将在文件中出现两次

标签: xml linux bash awk sed


【解决方案1】:

如果您的输入确实受到限制和常规,并且假设您由于某种原因不能使用 xmlstarlet 或类似内容,那么:

$ awk 'NR==FNR{map[$1]=$2; next} $3 in map{sub($3,map[$3])} 1' oldnewids FS='[<>]' file.xml
<faketag>192681118</faketag>
<faketag>192681121</faketag>
<faketag>192681124</faketag>
<faketag>192681127</faketag>
<faketag>192681130</faketag>
<faketag>192681133</faketag>

【讨论】:

  • 我会认为这是一个可接受的答案。这实际上是我正在寻找的,使用内置的。我不认为“只使用 xmlstarlet”是一个可以接受的答案,因为它假设在任何发行版上安装这个 3rd 方包都没有问题。
【解决方案2】:

我找到了一种非常简单但非常缓慢的方法。

while read a b
    do
    sed -i "s/$a/$b/g" file.xml
done < oldnewids

我认为这是一个可接受的答案,但欢迎使用更快的方法!

【讨论】:

  • 请参阅 why-is-using-a-shell-loop-to-process-text-considered-bad-practice 并且已经建议您考虑使用 xmlstarlet - 是吗?
  • 是的,我做到了,但由于 /etc/ld.cache.cache 的问题,在 debian 上正确安装软件包时出现了太多问题,所以我没有时间调查和解决.该循环虽然不是最佳实践,但仍然产生了预期的结果。
猜你喜欢
  • 2015-08-01
  • 2021-11-26
  • 2020-04-09
  • 2021-06-05
  • 2021-10-16
  • 1970-01-01
  • 2019-07-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多