【问题标题】:Replace string in XML file with awk/sed with string from another file用 awk/sed 将 XML 文件中的字符串替换为另一个文件中的字符串
【发布时间】:2016-05-23 09:34:02
【问题描述】:

抱歉,标题很长/很奇怪,但我遇到了一个问题。我有这个 XML 文件:

</member>
     <member>
      <name>TransactionID</name>
      <value><string>123456789123456</string></value>
     </member>
     <member>
      <name>Number</name>
      <value><string>765101293</string></value>
     </member>

在那里,我必须用另一个文件 file2 中的另一个值替换“765101293”:

765003448
765885388
764034143
784478101
762568592
769765134
767200702
769550613
784914007
762333840

因此,XML 文件将在 file2 中的每个新字符串处发生变化。我不知道该怎么做。我正在考虑首先使用 awk 处理 file2,然后将管道输入 sed:

代码:

#! /bin/bash -f

var=`awk -F,"\n" '{print $0}' "$1"`
sed -i "/7[0-9]{8}/c\$var/" "$2"

所以,我想用 file2 中的数据更新我的 XML 文件 (Update.xml)。对于 file2 的第一行,我将不得不更新现有的 XML:而不是“765101293”,我将把 file2 > 765003448 的第一行放入。然后我将把 xml 移到其他地方,然后我将传递给file2 的下一行。对 file2 的所有行重复该过程。当我像这样运行我的脚本时使用的两个变量 $1 和 $2:./script.sh file2 Update.xml。

谁能帮帮我?

编辑:

这是我的完整 xml 文件:

<methodCall>
 <methodName>UpdateOffer</methodName>
 <params>
  <param>
   <value>
    <struct>
     <member>
      <name>offerID</name>
      <value><i4>19</i4></value>
     </member>
     <member>
<name>startDate</name>
<value><dateTime.iso8601>20151028T14:11:00+0200</dateTime.iso8601></value>
</member>
     <member>
      <name>offerType</name>
      <value><i4>0</i4></value>
     </member>
     <member>
      <name>originHostName</name>
      <value><string>TEST</string></value>
     </member>
     <member>
      <name>originNodeType</name>
      <value><string>Prepaid</string></value>
     </member>
     <member>
      <name>originOperatorID</name>
      <value><string>operator</string></value>
     </member>
<member><name>originTimeStamp</name>
<value><dateTime.iso8601>20151028T14:16:36+0200</dateTime.iso8601></value>
</member>
     <member>
      <name>originTransactionID</name>
      <value><string>123456789123456</string></value>
     </member>
     <member>
      <name>subscriberNumber</name>
      <value><string>765101293</string></value>
     </member>
    </struct>
   </value>
  </param>
 </params>
</methodCall>

【问题讨论】:

  • 为什么不使用 XML 解析器或者 XSLT?
  • 不幸的是,要求是使用 sed/awk。

标签: xml linux awk sed


【解决方案1】:

听起来你只需要:

awk 'NR==FNR{nums[NR]=$0;next} sub(/>7[0-9]{8}</,">"nums[i+1]"<"){i++}' file2 Update.xml

但鉴于您问题中的小样本 XML 文件输入/输出,很难猜测。

请记住这一点:

  1. 每次您在 shell 中编写循环来操作文本时,您的方法都是错误的。见https://unix.stackexchange.com/questions/169716/why-is-using-a-shell-loop-to-process-text-considered-bad-practice
  2. shell 是一种环境,可从中操作文件和进程以及对工具的调用顺序。处理文本的 UNIX 工具是 awk。阅读 Arnold Robbins 所著的《Effective Awk Programming, 4th Edition》一书。

【讨论】:

  • 不幸的是,这不起作用。我会提供更多关于我想要它做什么的细节。我想将此块 subscriberNumber765101293 中的字符串“76..”替换为 file2 中的值。然后,xml 将被复制到其他地方,下一个值应该放在那里。例如,这将是第一次迭代: subscriberNumber765003448;第二个:subscriberNumber765885388 以此类推; xml 每次都会被覆盖
  • 不要尝试将格式化文本放入问题中,因为您做不到。编辑您的问题以显示您忘记的任何必要细节。话虽如此,我发布的脚本将完全按照您的意愿执行,而不会浪费大量时间来为每次更改打开/关闭文件。你试过了吗?如果它没有做你想要的,那么以什么方式说明。仅仅说“这不起作用”对于试图解决问题是完全没有用的。
猜你喜欢
  • 1970-01-01
  • 2011-07-01
  • 2019-03-21
  • 2018-05-07
  • 1970-01-01
  • 2018-05-19
  • 2011-12-21
  • 1970-01-01
  • 2012-08-18
相关资源
最近更新 更多