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

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

我有以下格式的文件

----------------------------------------
  Name: cust foo
  mail: [email protected]
  Account Lock: FALSE
  Last Password Change: 20170721085748Z
----------------------------------------
  Name: cust xyz
  mail: [email protected]
  Account Lock: TRUE
  Last Password Change: 20181210131249Z
----------------------------------------
  Name: cust bar
  mail: [email protected]
  Account Lock: FALSE
  Last Password Change: 20170412190854Z
----------------------------------------
  Name: cust abc
  mail: [email protected]
  Account Lock: FALSE
  Last Password Change: 20191030080405Z
----------------------------------------

我想将Last Password Change数据格式更改为,YYYY-MM-DD但不确定如何使用sedawk是否有任何其他方法,我可以尝试 for 循环并使用date -d选项,但不确定是否有更简单的方法来使用正则表达式

答案1

由于您所做的只是添加两个破折号,并删除一些额外的字符,因此不需要date.

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

对于更严格的模式,点(匹配任何字符)可以替换为[0-9]仅匹配数字。\1等等,当然在替换中扩展到括号​​中匹配的模式。

答案2

这是我的建议:

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

输出:

  Name: cust foo
  mail: [email protected]
  Account Lock: FALSE
  Last Password Change: 2017-07-21
----------------------------------------
  Name: cust xyz
  mail: [email protected]
  Account Lock: TRUE
  Last Password Change: 2018-12-10
----------------------------------------
  Name: cust bar
  mail: [email protected]
  Account Lock: FALSE
  Last Password Change: 2017-04-12
----------------------------------------
  Name: cust abc
  mail: [email protected]
  Account Lock: FALSE
  Last Password Change: 2019-10-30
----------------------------------------

答案3

我能够使用以下awk命令来完成此操作:

awk -F\: '$1 ~ /Last Password Change/{ OFS=":"; $2 = substr($2, 1, 5)"-"substr($2, 6, 2)"-"substr($2, 8, 2) }1'

用作:字段分隔符,如果第一列匹配,Last Password Change我们将用于substr提取年、月和日期,并将第二列替换为您所需格式的这些值。

相关内容