【问题标题】:Find pattern and Replace in Unix using Sed / Awk使用 Sed / Awk 在 Unix 中查找模式和替换
【发布时间】:2017-02-14 00:16:05
【问题描述】:

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

【问题讨论】:

    标签: xml bash unix awk sed


    【解决方案1】:

    您可能会收到“错误”,因为您的表达式中有 /。但是sed接受任何字符作为分隔符,只要在#后面指定即可:

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

    会做你想做的事(通过-i选项替换文件中的字符串。请注意,如果您有旧版本的sed,您必须重定向到另一个文件并将其移回原来的)

    【讨论】:

      【解决方案2】:

      awk类似

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

      【讨论】:

        【解决方案3】:

        试试这个:

        命令:

        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>
        

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

        【讨论】:

        • $ echo '&lt;LastUpdated&gt;2016-04-28 12:19:06.220&lt;/LastUpdated&gt;' | sed 's/.0&lt;\/Last/ .000&lt;\/Last/g' &lt;LastUpdated&gt;2016-04-28 12:19:06.2.000&lt;/LastUpdated&gt;
        • Salut Jean - ca marche pas?
        • 你必须逃离\.0。点表示正则表达式中的任何字符。
        • 哦,我知道了。 :)
        猜你喜欢
        • 2012-12-29
        • 2017-11-11
        • 2020-02-03
        • 2012-09-22
        • 2014-12-04
        • 1970-01-01
        • 2021-12-24
        • 2017-06-16
        • 1970-01-01
        相关资源
        最近更新 更多