【发布时间】:2017-09-27 16:38:06
【问题描述】:
我正在使用 awk 脚本在 bash 中解析 csv。用 "
引用的值"1";"2";"3"
有时我没有在像
这样的值中转义引号"1";"2"2";"3" 我需要翻译成"1";"22";"3"
如何删除 $2 中的这些 "?首先,我尝试检查 $2 是否有引号,但我卡住了。如果我使用 gsub,它将删除 $2 中的所有引号,我会得到"1";22;"3"。我考虑在 gensub 中使用 gsub,但没有找到如何将函数传递给 gensub 的第二个参数。
cat test |
awk 'BEGIN {OFS=FS=";"} \
{if ($2 ~ /^\".*.[\"].*\"$/) {$2 = "need help here")} \
print}'
****************更新****************
也许还有另一种方法。 awk 是否有任何特殊选项不仅可以设置分隔符,还可以为分隔值设置引号?如果 $1 等可以不被视为“价值”而是引号内的价值本身,那就太棒了
【问题讨论】:
-
修复 CSV 生成器代码,使其不会生成格式错误的 CSV 数据。踢,尖叫,大喊,大喊——在紧急情况下,提出为他们修复它——但做一些事情,这样就不需要修复拙劣的文件。显然,在短期内(一次性),您将不得不破解数据,但您不应该这样做,而且任何超过一次性的事情都是不可接受的。如果要嵌入引号,则应将它们加倍:
"1";"2""2";"3"是有效的 CSV,其中中心字段在未加引号时具有值2"2。 -
@JonathanLeffler 谢谢,但是 abnf 说这个值是 'word' 并且 'word' 可以包含 'DQUOTE' 所以我唯一能做的就是将引号从 " 更改为 ' 或其他东西,但它会给我* ss带来很大的痛苦,因为我需要重新配置我的生产环境,这并不容易。所以首先我需要考虑临时解决方法。
-
你指的是哪个 ABNF?
-
根据任何记录在案的“标准”,双引号只能出现在带引号的字段中的两种方式:
"foo""bar"或"foo\"bar"。那是因为分隔符本身(例如数据中的;)总是可以出现在引号内(这就是为什么需要封装引号的原因)所以如果也可以出现未转义的引号,那么"foo";"bar"是否意味着包含2个引号的1个字段和一个分号(在标准表示法中是"foo"";""bar"或"foo\";\"bar")还是两个单独的字段?修复生成非标准、模棱两可 CSV 的工具,然后您将拥有各种选择。 -
请注意,如果您指的是 RFC 4180 Comma-Separated Values 中的 ABNF,那么 (a) 您的数据不是逗号分隔的,并且 (b) DQUOTE 有特殊处理。