我需要更改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>
答案 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感知工具。警告。