使用'sed'或'awk'在文件中添加前导零日期

时间:2018-11-08 00:39:51

标签: awk sed

我有一个文件,其中包含这种格式的日期(每隔几天更改一次)

1/5/2016

我需要在月/日中添加一个零,以使单位月和日看起来像这样。

01/05/2016

我在线找到了一个“ sed”命令,但是它只在“ /”之间的数字上加上零,而不是第一个数字。有什么建议吗?

这是命令:

sed -e 'sx\([^0-9]\)\([0-9]/\)x\10\2xg' -e 'sx/\([0-9]/\)x/0\1xg' /path/to/your/file

1 个答案:

答案 0 :(得分:1)

关于您的操作有误,您的第一个sed节将仅在以不是字符开头的日期上运行。这意味着它将不会在行首的日期上运行,因为前面没有字符。

请参阅以下成绩单:

pax$ echo "1/1/2001 1/1/2001" | sed -e 'sx\([^0-9]\)\([0-9]/\)x\10\2xg' -e 'sx/\([0-9]/\)x/0\1xg'
1/01/2001 01/01/2001

pax$ echo "_1/1/2001 1/1/2001" | sed -e 'sx\([^0-9]\)\([0-9]/\)x\10\2xg' -e 'sx/\([0-9]/\)x/0\1xg'
_01/01/2001 01/01/2001

您看到那里的第一个日期在第一个命令中不能正确更改,而在第二个命令中却可以正确更改,因为它前面有一个字符。

对此的快速解决方案是仅添加另一个子句来处理该行开始情况:

-e 'sx^\([0-9]/\)x0\1xg'

如果您的sed支持扩展正则表达式,还可以修改第一个节以处理两种情况(非数字或起始锚):

pax$ echo "1/1/2001 1/1/2001" | sed -r -e 'sx([^0-9]|^)([0-9]/)x\10\2xg' -e 'sx/([0-9]/)x/0\1xg'
01/01/2001 01/01/2001

这也使您摆脱了一些难看的反斜线:-)

当然,如果您所有的日期都在该行的开头,或者您在一个单行文件中的行开始处有一个一个日期(您的第一段似乎来暗示这一点),它变得更简单了

pax$ echo "1/1/2001" | awk -F/ '{printf "%02d/%02d/%04d\n", $1, $2, $3}'
01/01/2001