首页 > 解决方案 > sed - 在第一次正则表达式匹配后替换逗号

问题描述

我试图对一般格式的行执行以下替换:

BBBBBBB.2018_08,XXXXXXXXXXXXX,01/01/2014,"109,07",DF,CCCCCCCCCCC, .......

如您所见,问题在于它是一个逗号分隔的文件,其中一个包含逗号小数的特定字段。我想用一个点替换它。

我试过这个,以替换匹配后第一次出现的模式,但无济于事,有人可以帮助我吗?

sed -e '/,"/!b' -e "s/,/./"
sed -e '/"/!b' -e ':a' -e "s/,/\./"

提前致谢。awk 或 perl 解决方案也会对我有所帮助。这是一个 awk 的努力:

gawk -F "," 'substr($10, 0, 3)==3 && length($10)==12 { gsub(/,/,".", $10); print}'

这产生了相同的文件不变。

标签: perltextawksedreplace

解决方案


CSV 文件应awk使用适当的FPAT变量进行解析,该变量定义构成此类文件中有效字段的内容。一旦你这样做了,你就可以遍历字段来做你需要的替换

gawk 'BEGIN { FPAT = "([^,]+)|(\"[^\"]+\")"; OFS="," } 
       { for(i=1; i<=NF;i++) if ($i ~ /[,]/) gsub(/[,]/,".",$i);}1' file

请参阅我的这个答案以了解如何使用FPAT变量定义和解析 CSV 文件内容。另请参阅使用 awk 就地保存修改以进行就地文件修改,例如sed -i''.


推荐阅读