【问题标题】:Find and Replace text in XML tags in Unix在 Unix 中查找和替换 XML 标记中的文本
【发布时间】:2017-02-13 13:30:00
【问题描述】:

我需要更改 XML 标记中的日期格式。我已经在命令行中编写了 awk 来查找替换日期格式 - echo '2012-01-13' | awk -v FS=- -v OFS=/ '{print $2,$3,$1}' 。但不确定如何在 XML 中继续使用它..

使用的 XML

<OrderNbr>136642</OrderNbr>
<CustomerName>MIKE</CustomerName>
<CustomerType>NEW</CustomerType>
<DateOfBirth>1986-09-03</DateOfBirth>
<LastUpdated>2012-03-28 00:01:02.133</LastUpdated>

需要跨 XML 更改 DoB 格式。

预期输出:

<OrderNbr>136642</OrderNbr>
<CustomerName>MIKE</CustomerName>
<CustomerType>NEW</CustomerType>
<DateOfBirth>09/03/1986</DateOfBirth>
<LastUpdated>2012-03-28 00:01:02.133</LastUpdated>

【问题讨论】:

  • 不要那样做。如果输入是有效的 XML(您的示例不是),则使用 XML 感知工具,如 xmlstarletxsltproc。其次,您不应该将完美的日期格式转换为愚蠢的日期格式。

标签: xml shell unix awk sed


【解决方案1】:

这是一种方法,前提是&lt;DateOfBirth&gt; 标签和日期在同一行

$ cat ip.xml
<OrderNbr>136642</OrderNbr>
<CustomerName>MIKE</CustomerName>
<CustomerType>NEW</CustomerType>
<DateOfBirth>1986-09-03</DateOfBirth>
<LastUpdated>2012-03-28 00:01:02.133</LastUpdated>

$ sed -E '/<DateOfBirth>/ s|([0-9]{4})-([0-9]{2})-([0-9]{2})|\2/\3/\1|' ip.xml 
<OrderNbr>136642</OrderNbr>
<CustomerName>MIKE</CustomerName>
<CustomerType>NEW</CustomerType>
<DateOfBirth>09/03/1986</DateOfBirth>
<LastUpdated>2012-03-28 00:01:02.133</LastUpdated>
  • -E 扩展正则表达式选项
  • /&lt;DateOfBirth&gt;/ 仅替换匹配 &lt;DateOfBirth&gt; 的行
  • ([0-9]{4})-([0-9]{2})-([0-9]{2}) 仅捕获数字即可提取日期
  • \2/\3/\1 需要的输出格式

如果扩展的正则表达式选项不可用,这可能会起作用:

sed '/<DateOfBirth>/ s|\([0-9]\{4\}\)-\([0-9]\{2\}\)-\([0-9]\{2\}\)|\2/\3/\1|' ip.xml


perl类似的解决方案

$ perl -pe 's|(\d{4})-(\d{2})-(\d{2})|$2/$3/$1| if /<DateOfBirth>/' ip.xml 
<OrderNbr>136642</OrderNbr>
<CustomerName>MIKE</CustomerName>
<CustomerType>NEW</CustomerType>
<DateOfBirth>09/03/1986</DateOfBirth>
<LastUpdated>2012-03-28 00:01:02.133</LastUpdated>

【讨论】:

  • 我猜我的 bash 已经过时了。 sed -E 不起作用.. 非常感谢 :)
  • @Siva,在这种情况下,最好添加您拥有的 sed 版本,也可能是哪个操作系统.. perl 解决方案可以吗?与 sed 非常相似
  • @Siva,我还添加了一个没有-E 选项的解决方案,你能检查一下它是否有效吗?
  • 感谢 Sundeep,第二个成功了。非常感谢 :) 没有尝试 perl。
  • @Siva,很高兴这有效,不要忘记接受最适合您的答案:)
【解决方案2】:

这里是awk 版本:这将检查字符串“DateOfBirth”。如果看到此字符串,则提取日期并对其进行格式化。使用sub 将日期替换为修改日期。

awk -F'<|>' '/DateOfBirth/{split($3,a,"-");sub($3, a[2]"/"a[3]"/"a[1])}1' xml
<OrderNbr>136642</OrderNbr>
<CustomerName>MIKE</CustomerName>
<CustomerType>NEW</CustomerType>
<DateOfBirth>09/03/1986</DateOfBirth>
<LastUpdated>2012-03-28 00:01:02.133</LastUpdated>

注意:使用一些 XML 感知工具。警告。

【讨论】:

    猜你喜欢
    • 2019-10-16
    • 2015-03-07
    • 1970-01-01
    • 2011-02-16
    • 2016-10-07
    • 2013-08-20
    • 2014-08-17
    • 2016-03-18
    • 2012-02-13
    相关资源
    最近更新 更多