假设使用分号作为字段终止符的格式错误的 csv 片段:
abc;d" "e"f;"ijk"
根据RFC4180,字段内的 dquote 应由两个 dquote 表示:
abc;d"" ""e""f;"ijk"
我试图通过一个sed
脚本来实现这一点,该脚本匹配任何前面没有或后面没有字段终止符的 dquote(here ;
):
echo 'abc;d" "e"f;"ijk"' | sed -e 's/\([^;]\)"\([^;]\)/\1""\2/g'
结果几乎是好的:
abc;d"" "e""f;"ijk"
除了之前的双引号e
不匹配,因此不重复。
谁能解释我为什么这不起作用,因为之前和之后e
没有分号。
您的第二个报价不匹配,因为匹配将是
space quote e
,并且space
已经被前面的 消耗了d quote space
。这是环视匹配的教科书示例,它匹配但不消耗。不幸的是,环视匹配没有在
sed
. 如果我不得不使用sed
这个,我会首先用一些非出现的字符替换有效的引号,然后将所有剩余的引号加倍,然后放回有效的引号。Perl 有环视匹配,这在眼睛上(有点)容易:
翻译:前面没有 regex 的引号
;
,后面没有 regex[;\n]
。\n 在那里是因为 perl 认为它是行的一部分,因此除非我们禁止它,否则它将匹配最后一个引号。