我必须更改以下列格式编写的CSV文件列(日期):
YYYY-MM-DD
我希望它是
YYYY.MM.DD
我可以写一系列2 sed 规则管道一个到另一个,如:
sed 's/-/./' file.csv | sed 's/-/./'
但这不干净。我的问题是:有没有办法在sed中分配变量并告诉它YYYY-MM-DD
应该被解析为year=YYYY ; month=MM ; day=DD
然后告诉它
write $year.$month.$day
或类似的东西?也许用awk?
答案 0 :(得分:2)
您可以使用群组直接通过反向引用访问年,月和日:
sed 's#\([0-9][0-9][0-9][0-9]\)-\([0-9][0-9]\)-\([0-9][0-9]\)#\1.\2.\3#g'
答案 1 :(得分:0)
您所做的相当于提供“全局”替换标志:
sed 's/-/./g' file.csv
sed
没有变量,但确实有编号组:
sed -r 's/([0-9]{4})-([0-9]{2})-([0-9]{2})/\1.\2.\3/g' file.csv
或者,如果您的sed
没有-r
:
sed 's/\([0-9]\{4\}\)-\([0-9]\{2\}\)-\([0-9]\{2\}\)/\1.\2.\3/g' file.csv
答案 2 :(得分:0)
您也可以尝试这个sed
命令,
sed 's/\([0-9]\{4\}\)\-\([0-9]\{2\}\)\-\([0-9]\{2\}\)/\1.\2.\3/g' file
示例:
$ (echo '2056-05-15'; echo '2086-12-15'; echo 'foo-bar-go') | sed 's/\([0-9]\{4\}\)-\([0-9]\{2\}\)-\([0-9]\{2\}\)/\1.\2.\3/g'
2056.05.15
2086.12.15
foo-bar-go
答案 3 :(得分:0)
以下是使用awk
的替代解决方案:
awk 'BEGIN { FS=OFS="," } { gsub("-", ".", $1); print }' file.csv
BEGIN { FS=OFS="," }
告诉awk
按,
(变量FS
,[输入]字段分隔符)将输入行分成字段,并使用{ {1}} 输出 修改输入行(变量,
时,输出字段分隔符)。OFS
用字段 1 中的gsub("-", ".", $1)
替换所有-
个实例
.
;如果字段索引不同,请相应地替换$1
中的1
。$1
只输出修改后的输入行,以换行符结尾。