如何将日期修剪为 00/00/0000 格式?

如何将日期修剪为 00/00/0000 格式?

我想将 .csv 文件中已提取的日期从 0/0/0000 填充并替换为 00/00/0000,例如 1/9/2016 --> 01/09/2016

我有这个脚本

sed 's/\/1\//\/01\//g; s/\/2\//\/02\//g; s/\/3\//\/03\//g; s/\/4\//\/04\//g; s/\/5\//\/05\//g; s/\/6\//\/06\//g; s/\/7\//\/07\//g; s/\/8\//\/08\//g; s/\/9\//\/09\//g' file_name.csv > file_name2.csv
sed 's/,1\//,01\//g; s/,2\//,02\//g; s/,3\//,03\//g; s/,4\//,04\//g; s/,5\//,05\//g; s/,6\//,06\//g; s/,7\//,07\//g; s/,8\//,08\//g; s/,9\//,09\//g' file_name2.csv > file_name3.csv 

答案1

0如果前两个数字是个位数,则此 sed 语句将在前两个数字上添加 a :

sed -e 's!^[0-9]/!0&!' -e 's!/\([0-9]/\)!/0\1!'        

例如

$ cat x
1/1/1970
10/1/2000
10/10/2100

$ sed -e 's!^[0-9]/!0&!' -e 's!/\([0-9]/\)!/0\1!' x
01/01/1970
10/01/2000
10/10/2100

答案2

事实上,只要你做出很多假设,事情就很简单。由于问题没有提供示例,因此以下是一些现实的假设:

  • 日期字段之间的分隔符是/
  • csv 文件有多于一列
  • 日期可以在任何列中
  • 其他列可能有数字

斯蒂芬的例子没有解决最后三个问题。这是一个显示两项改进的脚本:

#!/bin/sh
INPUT=foo.csv
echo GIVEN
cat $INPUT
echo BEFORE
sed -e 's!^[0-9]/!0&!' -e 's!/\([0-9]/\)!/0\1!' <$INPUT
echo IMPROVED
sed     \
        -e 's,^\([0-9][/]\),0\1,' \
        -e 's,\([,/]\)\([0-9]\),\10000\2,g' \
        -e 's,^0*\([0-9]\{2\}[/]\),\1,' \
        -e 's,\([,/]\)0*\([0-9]\{2\}\),\1\2,g' \
        <$INPUT
echo BETTER
sed     \
        -e 's,^\([0-9][/]\),0\1,' \
        -e 's,\([,/]\)\([0-9]\),\10000\2,g' \
        -e 's,^0*\([0-9]\{2\}[/]\),\1,' \
        -e 's!0*\([0-9]\{2\}\)\([,/]\)0*\([0-9]\{2\}\)\([/]\)0*\([0-9]\{4,\}\)!\1\2\3\4\5!g' \
        <$INPUT

以及运行脚本的输出:

GIVEN
1/1/1970
10/1/2000
10/10/2100
first,1/1/1970
second,10/1/2000
third,10/10/2100
9term,1/1/1
BEFORE
01/01/1970
10/01/2000
10/10/2100
first,1/01/1970
second,10/01/2000
third,10/10/2100
9term,1/01/1
IMPROVED
01/01/1970
10/01/2000
10/10/2100
first,01/01/1970
second,10/01/2000
third,10/10/2100
9term,01/01/01
BETTER
01/01/1970
10/01/2000
10/10/2100
first,01/01/1970
second,10/01/2000
third,10/10/2100
9term,01/01/0001

完整的解决方案将更好地考虑边界(例如是否折扣诸如 之类的内容1/1/1text)和引号(csv 文件使用双引号来解决列中的逗号问题)。

相关内容