在csv文件中如果介于两者之间,则存在两个以上"
,那么我想使用shell脚本仅用两个"
替换它们。
示例
如果在csv文件中它是"""any word""
,它应该替换为"any word"
,或者如果它是[any number of "]
,它应该替换为,{{1} }}
仅供参考:“这是双引号而不是两个单引号。 和[]实际上并不存在于数据中,我将其理解为
答案 0 :(得分:0)
awk 解决方案:
示例testfile
内容:
sdsdf,"""hello"",sdsdf
asdasd,[asdasd asdasd]",sdfsdf
sdf,"[asdasd]",asdasd
工作:
awk -F, '{ for(i=1;i<=NF;i++) if($i~/"{2,}/) gsub(/"+/,"\"",$i);
else if($i~/^[^"]*"{1,}[^"]*$/) $i="\"\""; }1' OFS=',' testfile
输出:
sdsdf,"hello",sdsdf
asdasd,"",sdfsdf
sdf,"[asdasd]",asdasd
答案 1 :(得分:0)
这是一个sed解决方案,它作为OP在逗号之间起作用,但如果引号之间有逗号,则不起作用:
sed ':a;s/\(,"[^,"]*\|^"[^,"]*\)"\([^,]\)/\1\2/;ta' testfile
使用Roman的测试文件我的输出是:
sdsdf,"hello",sdsdf
asdasd,[asdasd asdasd]",sdfsdf
sdf,"[asdasd]",asdasd
请注意,第二行的第二个字段在我的版本中是不同的,因为我不确定在这种情况下OP想要什么行为,或者甚至存在这样的字段。
答案 2 :(得分:0)
尝试使用罗马的文件
awk -F, '{gsub(/"""hello""/,"\42hello\42",$2)gsub(/\[asdasd asdasd\]/,"\42")}1' OFS=, file
sdsdf,"hello",sdsdf
asdasd,"",sdfsdf
sdf,"[asdasd]",asdasd