使用Sed / Awk在Unix中查找模式和替换

时间:2016-10-05 13:52:01

标签: xml bash unix awk sed

在下面的XML中,我需要在<LastUpdated>标签中找到时间戳,单个数字为0毫秒,并将它们更新为000.为此尝试Sed但不断出错。

<Order>
<OrderNbr>136642</OrderNbr>
<CustomerName>MIKE</CustomerName>
<CustomerType>NEW</CustomerType>
<DateOfBirth>09/03/1986</DateOfBirth>
<LastUpdated>2012-03-28 00:01:02.0</LastUpdated>
</Order>
<Order>
<OrderNbr>145645</OrderNbr>
<CustomerName>STEVE</CustomerName>
<CustomerType>NEW</CustomerType>
<DateOfBirth>05/08/1986</DateOfBirth>
<LastUpdated>2014-03-28 10:09:04.456</LastUpdated>
</Order>
<OrderNbr>128965</OrderNbr>
<CustomerName>MARK</CustomerName>
<CustomerType>NEW</CustomerType>
<DateOfBirth>04/09/1989</DateOfBirth>
<LastUpdated>2016-04-28 12:19:06.0</LastUpdated>
</Order>

预期输出:

<Order>
<OrderNbr>136642</OrderNbr>
<CustomerName>MIKE</CustomerName>
<CustomerType>NEW</CustomerType>
<DateOfBirth>09/03/1986</DateOfBirth>
<LastUpdated>2012-03-28 00:01:02.000</LastUpdated>
</Order>
<Order>
<OrderNbr>145645</OrderNbr>
<CustomerName>STEVE</CustomerName>
<CustomerType>NEW</CustomerType>
<DateOfBirth>05/08/1986</DateOfBirth>
<LastUpdated>2014-03-28 10:09:04.456</LastUpdated>
</Order>
<OrderNbr>128965</OrderNbr>
<CustomerName>MARK</CustomerName>
<CustomerType>NEW</CustomerType>
<DateOfBirth>04/09/1989</DateOfBirth>
<LastUpdated>2016-04-28 12:19:06.000</LastUpdated>
</Order>

3 个答案:

答案 0 :(得分:0)

你可能会得到&#34;错误&#34;因为你的表达中有/。但是sed接受任何字符作为分隔符,只需在#之后指定它:

sed -i "s#\.0</LastUpdated>#.000</LastUpdated>#" yourxml.xml

将执行您想要的操作(感谢-i选项替换文件中的字符串。请注意,如果您使用的是sed的旧版本,则必须重定向到另一个文件&amp;把它移回原来的那个)

答案 1 :(得分:0)

awk

类似
$ awk '/LastUpdated/{sub(/\.0</,".000")}1' file > temp && mv temp file

答案 2 :(得分:0)

试试这个:

命令:

bash > echo '<LastUpdated>2016-04-28 12:19:06.0</LastUpdated>' | sed 's/\.0<\/Last/.000<\/Last/g'

输出:

<LastUpdated>2016-04-28 12:19:06.000</LastUpdated>

更新:这仅对“时间”有效,“时间”具有单个零位数(以毫秒为单位)。它不适用于不是单个数字零毫秒值的值。