2017-08-31 15 views
0

在csv文件如果在之间有两个,有两个以上的"存在,那么我想,只有两个"使用shell脚本来替换它们。如何更换多个“在两者之间,与SED帮助或AWK

如果CSV文件很是喜欢,"""any word"",应该会被替换,"any word",或者如果是喜欢,[any number of "],它应该得到与更换,""

FY我:“这是双引号,不是两个单引号。 和[]未在数据实际上目前我给它对于理解

+0

为什么'[任意数量的“],'应该与'代替,””,'? – RomanPerekhrest

+0

@RomanPerekhrest它是在数据库中装载数据的要求 中如果有两个以上的“现在两者之间,它产生了一个问题 – varad

+0

如何使用该值',[任一‘字’之句]'应该如何治疗? – RomanPerekhrest

回答

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 
+0

能否请您解释一下它是如何工作的? – varad

0

这里有一个sed的解决方案,如OP工作逗号之间,但不工作,如果有逗号在引号之间:

sed ':a;s/\(,"[^,"]*\|^"[^,"]*\)"\([^,]\)/\1\2/;ta' testfile

使用罗马的测试文件,我的输出是:

sdsdf,"hello",sdsdf 
asdasd,[asdasd asdasd]",sdfsdf 
sdf,"[asdasd]",asdasd 

注意,第二行的第二场不同的是,我已经rsion,因为我不确定OP在这种情况下需要什么行为,或者像这样的字段甚至存在。

+0

sed':a; s/\(,“[^,”] * \)“\([^,] \)/ \ 1 \ 2 /; ta'testfile 这对我有用 你能解释一下吗它是如何工作请 – varad

+0

它是删除多余的“正确,但它也是删除”这是在行的末尾:( – varad

+0

它的工作原理是通过应用使用现代正则表达式的替代将被写为s /(,“ [^,“] * | ^”[^,“] *)”([^,])/ \ 1 \ 2 /'然后再次运行替换,如果有匹配。在匹配第一个字段时纠正错误)在字段中删除引号可以使用www.regex101.com来了解正则表达式的工作原理用测试文件更新您的问题我的版本在末尾不删除引号在'foo'中,'' – rubystallion

0

尝试使用罗马的文件

awk -F, '{gsub(/"""hello""/,"\42hello\42",$2)gsub(/\[asdasd asdasd\]/,"\42")}1' OFS=, file 

sdsdf,"hello",sdsdf 
asdasd,"",sdfsdf 
sdf,"[asdasd]",asdasd