正则表达式将单引号替换为常量

时间:2014-03-10 12:04:12

标签: shell sed awk

我有一个csv文件,我需要加载到postgres。

值看起来像

Date, Col1, Col2, Col3, Col4
20140101,value1, value2, value3, "http//,bar"
20130102,value1, value2, value3, "http//,bar"
20130103,value1, value2", value3, "http//,XXX"

在我的一些数据中(如第3行所示)我有一些不良数据,其中value2在其末尾有双引号。

不幸的是我无法控制输入数据。

使用postgres COPY命令“as csv”我收到错误的未终止报价。

我无法删除文件中的所有引号,因为最后一列4的值中嵌入了逗号,而逗号是我的分隔符。

基本上我正在寻找的是某种类型的SED脚本,可以删除所有出现的双引号UP,直到第一次出现“http // .....最后一列总是有”http // “因此我很好地将其用作常数。

在上面的示例中,第1行和第2行是正确的。第3行应该从

改变
20130103,value1, value2", value3, "http//,XXX"

20130103,value1, value2, value3, "http//,XXX"

2 个答案:

答案 0 :(得分:0)

使用perl会更容易,因为它支持前瞻:

perl -pe 's/"(?=.*?"http)//g' file.csv
Date, Col1, Col2, Col3, Col4
20140101,value1, value2, value3, "http//,bar"
20130102,value1, value2, value3, "http//,bar"
20130103,value1, value2, value3, "http//,XXX"

或使用awk:

awk -F'"http' 'index($1, "\"") { gsub(/"/, "", $1); $1=$1 FS } 1' file
Date, Col1, Col2, Col3, Col4"http
20140101,value1, value2, value3, "http //,bar"
20130102,value1, value2, value3, "http //,bar"
20130103,value1, value2, value3, "http //,XXX"

答案 1 :(得分:0)

这可能适合你(GNU sed):

sed -r ':a;s|"(.*"http//)|\1|;ta' file