在csv文件如果在之间有两个,有两个以上的"
存在,那么我想,只有两个"
使用shell脚本来替换它们。如何更换多个“在两者之间,与SED帮助或AWK
例
如果CSV文件很是喜欢,"""any word""
,应该会被替换,"any word"
,或者如果是喜欢,[any number of "]
,它应该得到与更换,""
。
FY我:“这是双引号,不是两个单引号。 和[]未在数据实际上目前我给它对于理解
在csv文件如果在之间有两个,有两个以上的"
存在,那么我想,只有两个"
使用shell脚本来替换它们。如何更换多个“在两者之间,与SED帮助或AWK
例
如果CSV文件很是喜欢,"""any word""
,应该会被替换,"any word"
,或者如果是喜欢,[any number of "]
,它应该得到与更换,""
。
FY我:“这是双引号,不是两个单引号。 和[]未在数据实际上目前我给它对于理解
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
能否请您解释一下它是如何工作的? – varad
这里有一个sed的解决方案,如OP工作逗号之间,但不工作,如果有逗号在引号之间:
sed ':a;s/\(,"[^,"]*\|^"[^,"]*\)"\([^,]\)/\1\2/;ta' testfile
使用罗马的测试文件,我的输出是:
sdsdf,"hello",sdsdf
asdasd,[asdasd asdasd]",sdfsdf
sdf,"[asdasd]",asdasd
注意,第二行的第二场不同的是,我已经rsion,因为我不确定OP在这种情况下需要什么行为,或者像这样的字段甚至存在。
sed':a; s/\(,“[^,”] * \)“\([^,] \)/ \ 1 \ 2 /; ta'testfile 这对我有用 你能解释一下吗它是如何工作请 – varad
它是删除多余的“正确,但它也是删除”这是在行的末尾:( – varad
它的工作原理是通过应用使用现代正则表达式的替代将被写为s /(,“ [^,“] * | ^”[^,“] *)”([^,])/ \ 1 \ 2 /'然后再次运行替换,如果有匹配。在匹配第一个字段时纠正错误)在字段中删除引号可以使用www.regex101.com来了解正则表达式的工作原理用测试文件更新您的问题我的版本在末尾不删除引号在'foo'中,'' – rubystallion
尝试使用罗马的文件
awk -F, '{gsub(/"""hello""/,"\42hello\42",$2)gsub(/\[asdasd asdasd\]/,"\42")}1' OFS=, file
sdsdf,"hello",sdsdf
asdasd,"",sdfsdf
sdf,"[asdasd]",asdasd
为什么'[任意数量的“],'应该与'代替,””,'? – RomanPerekhrest
@RomanPerekhrest它是在数据库中装载数据的要求 中如果有两个以上的“现在两者之间,它产生了一个问题 – varad
如何使用该值',[任一‘字’之句]'应该如何治疗? – RomanPerekhrest