在Unix

时间:2016-10-05 07:51:13

标签: xml shell unix awk sed

我需要更改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>

2 个答案:

答案 0 :(得分:2)

如果<DateOfBirth>代码和日期在同一行,

这是一种方法

$ 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扩展正则表达式选项
  • /<DateOfBirth>/仅替换匹配<DateOfBirth>
  • 的行
  • ([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>

答案 1 :(得分:1)

这是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感知工具。警告。