繁体   English   中英

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

[英]Find pattern and Replace in Unix using Sed / Awk

在下面的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>

您可能会收到“错误”,因为表达式中包含/ 但是sed可以接受任何字符作为分隔符,只需在#之后指定即可:

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

将执行您想要的操作(通过-i选项将字符串替换为文件中的字符串。请注意,如果您使用的是sed的旧版本,则必须重定向到另一个文件并将其移回原始文件)

awk类似

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

尝试这个:

命令:

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>

更新:这仅对以毫秒为单位的零位的“时间”有效。 它不适用于不是一位零零毫秒值的值。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM