我有一个文件,其中包含这种格式的日期(每隔几天更改一次)
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
答案 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