我想将 .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 文件使用双引号来解决列中的逗号问题)。