如何在sed或awk的帮助下替换两个“之间的”

时间:2017-08-31 10:18:13

标签: shell unix awk sed

在csv文件中如果介于两者之间,则存在两个以上",那么我想使用shell脚本仅用两个"替换它们。

示例

如果在csv文件中它是"""any word"",它应该替换为"any word",或者如果它是[any number of "],它应该替换为,{{1} }}

仅供参考:“这是双引号而不是两个单引号。 和[]实际上并不存在于数据中,我将其理解为

3 个答案:

答案 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