【发布时间】:2018-12-05 08:20:00
【问题描述】:
我目前有几个 csv 文件,我无法控制它们的创建方式。不用说...它们格式不正确,不符合 RFC 4180。
示例输入:gist
",0000000000000000";"0";"1115S021121-12-1/2"M"
",0000000000000000";"0";"1115S021122-12-1/2"M"
",0000000000000000";"0";"1115S021123-12-1/2"M"
",0000000000000000";"0";"1115S021124-12-1/2"M"
"1";"1";"EXAMPLE_RANDOM" . STRING"
"2,0000000000000000";"2";"this;can"also happen"
想要的:
",0000000000000000";"0";"1115S021121-12-1/2""M"
我一直在尝试通过使用正则表达式运行 sed 来修复它。但是我只有 regex 的基本知识,sed 不想在我的尝试中表现得很好。
有人可以帮我避开双引号内的英寸引号“吗? 我知道这样的解决方案只有 99%,我只能依靠以下事实。
- 分隔符是;
- 附件是“
- " 可以在引用的文本字段中出现多次。
这意味着一个;或 " 可能出现在引用的字段中。 有人可以帮我把“换成”吗?
我尝试将几个stackoverflow帖子的正则表达式结合起来。
sed -E "s/[^\"](?<!;)\"(?!;|$)/\1"/g" $filename.test2 -> error
sed "s/[^\"](?<!;)(\")(?!;|$)/\1/g" $filename.test2 -> error
... about 10 more variations, some even without errors but no replaced strings.
如果有人有除正则表达式之外的其他解决方案,我们非常感谢任何帮助!
编辑:感谢@choroba perl wizzard。以下修复了文件。
cat $filename.test | perl -pe 's/(?<=[^;])"(?=[^;])/""/g' > $filename.test2
【问题讨论】:
-
我可以解析 ",0000000000000000";"0";"1115S021121-12-1/2""M"
-
输入中是否有已正确转义的双引号?
-
输入文件中暂时没有双引号。但是,如果它们应该发生,它们也需要被转义。所以这总共有4个报价。 """"
-
三引号呢?比如
",00000000"""00000000"。应该怎么办? -
不知道为什么这被标记为
go