Linux

在文件中使用 sed 或 awk 更改日期格式

  • November 1, 2019

我有以下格式的文件

----------------------------------------
 Name: cust foo
 mail: cust.foo@example.com
 Account Lock: FALSE
 Last Password Change: 20170721085748Z
----------------------------------------
 Name: cust xyz
 mail: cust.xyz@example.com
 Account Lock: TRUE
 Last Password Change: 20181210131249Z
----------------------------------------
 Name: cust bar
 mail: cust.bar@example.com
 Account Lock: FALSE
 Last Password Change: 20170412190854Z
----------------------------------------
 Name: cust abc
 mail: cust.abc@example.com
 Account Lock: FALSE
 Last Password Change: 20191030080405Z
----------------------------------------

我想將Last Password Change數據格式更改為YYYY-MM-DD但不確定如何使用sedawk是否有任何其他方法,我可以嘗試循環它並使用date -d選項但不確定是否有更簡單的方法來使用正則表達式

由於您所做的只是添加兩個破折號並刪除一些額外的字元,因此不需要date.

$ sed -Ee 's/(Last Password Change: )(....)(..)(..).*Z/\1\2-\3-\4/' < foo.txt
...
 Name: cust foo
 mail: cust.foo@example.com
 Account Lock: FALSE
 Last Password Change: 2017-07-21
...

對於更嚴格的模式,點(匹配任何字元)可以替換[0-9]為僅匹配數字。\1等在替換當然擴展到括號中的模式匹配。

這是我的建議:

sed -E 's/([0-9]{4})([0-9]{2})([0-9]{2})[0-9]{6}Z/\1-\2-\3/' file

輸出:

 Name: cust foo
 mail: cust.foo@example.com
 Account Lock: FALSE
 Last Password Change: 2017-07-21
----------------------------------------
 Name: cust xyz
 mail: cust.xyz@example.com
 Account Lock: TRUE
 Last Password Change: 2018-12-10
----------------------------------------
 Name: cust bar
 mail: cust.bar@example.com
 Account Lock: FALSE
 Last Password Change: 2017-04-12
----------------------------------------
 Name: cust abc
 mail: cust.abc@example.com
 Account Lock: FALSE
 Last Password Change: 2019-10-30
----------------------------------------

引用自:https://unix.stackexchange.com/questions/549933