我有一个 sed 命令,一直用来格式化数据集中的日期。我遇到了一个问题,我确信这只是我对语法缺乏理解,但想知道是否有人可以帮助澄清发生了什么。
输入:
26,082619,1300,1,2,0
26,082619,1400,332,8,190
26,082619,1500,442,10,118
26,082619,1600,530,151,12
26,082619,1700,534,164,0
26,082619,1800,538,176,0
命令
sed -E "s/,(.{2})(.{2})(.{2}),/,\1\/\2\/20\3,/g" input.csv > output.csv
输出(注意第3行)
26,08/26/2019,1300,1,2,0
26,08/26/2019,1400,332,8,190
26,08/26/2019,1500,44/2,/2010,118
26,08/26/2019,1600,530,151,12
26,08/26/2019,1700,534,164,0
26,08/26/2019,1800,538,176,0
预期产出
26,08/26/2019,1300,1,2,0
26,08/26/2019,1400,332,8,190
26,08/26/2019,1500,442,10,118
26,08/26/2019,1600,530,151,12
26,08/26/2019,1700,534,164,0
26,08/26/2019,1800,538,176,0
答案1
这个问题有两个方面:
在面向行的上下文中,
.
匹配任何性格——包括,
您使用了该
g
标志,它告诉 sed 在一行中进行尽可能多的替换
因此它匹配以逗号为界的六个字符的所有非重叠序列。
对于您的示例数据,删除标志就足够了g
,以便只替换第一个匹配的序列 - 但是您还应该考虑.
用更具体的内容替换,例如[^,]
(逗号以外的任何字符)或[0-9]
(任何拉丁十进制数字)。