Regex sed/awk-在模式匹配后插入空格

Regex sed/awk-在模式匹配后插入空格,regex,awk,sed,Regex,Awk,Sed,我尝试使用sed在csv文件中全局查找和替换,其中每个字段都用“分隔,但字段的某些内容也可以包含”分隔。 我试图找到字段中最后一个字符为“的位置,并在其后插入空格,以便字段以空格结束,而不是“。 请注意,一行中可能有多个字段,其中字段的最后一个字符可以是” 例如,下面是一些文件内容(4行) 它应该变成 "123","def","","","" "456","seven eight "nine" ten","","","" "789"."twenty thirty sixty "seven" ",

我尝试使用sed在csv文件中全局查找和替换,其中每个字段都用“分隔,但字段的某些内容也可以包含”分隔。 我试图找到字段中最后一个字符为“的位置,并在其后插入空格,以便字段以空格结束,而不是“。
请注意,一行中可能有多个字段,其中字段的最后一个字符可以是”

例如,下面是一些文件内容(4行)

它应该变成

"123","def","","",""
"456","seven eight "nine" ten","","",""
"789"."twenty thirty sixty "seven" ","","",""
"303030","one two "three" "four" ","five "six" ","",""
i、 e.插入空格的3个位置:第三行一次,第四行两次

目前我得到的结果是:

1,$ s/[^,]"",/" ",/g
所以它会找到所有出现的地方,但不会在匹配之前保留角色,所以我得到了结果

"123","def","","",""
"456","seven eight "nine" ten","","",""
"789"."twenty thirty sixty "seve" ","","",""
"303030","one two "three" "fou" ","five "si" ","",""
如何使用sed或awk获得所需的输出


谢谢。

您需要创建一个捕获组,并在替换中使用反向引用:

sed -E 's/([^,"])""/\1" "/g' file

要以内联方式保存更改,请使用:

sed -i.bak -E 's/([^,"])""/\1" "/g' file

谢谢,但这给了我“s”命令的RHS上的无效引用\1”-我不明白为什么它无法解析捕获组。您是否按照建议使用了
sed-E
?我使用了-E(脚本表达式)-我正在RHEL上运行。-E在我的版本中不是有效参数,然后尝试:
sed's/\([^,]\)“”/\1“/g'文件
很高兴知道它成功了,根据CSV的RFC和Excel(事实上CSV标准),在双引号分隔的字段中使用未替换的双引号是无效的。在双引号中,双引号应通过将其加倍来转义
“这是一种方式”
,或者在前面加反斜杠
“这是另一种方式”
。修复生成无效CSV的任何工具,或者至少在您请求帮助编写的新工具的输出中修复它,而不是在您的CSV中引入另一个非标准异常,然后查看如何使用awk解析它。不幸的是,我收到的文件来自一个不愿意为我们调整格式的客户供应商,所以我必须解决这个问题。好的,那么您至少应该在您当前编写的工具的输出中修复它,以便其他工具可以使用它。
"123","def","","",""
"456","seven eight "nine" ten","","",""
"789"."twenty thirty sixty "seven" ","","",""
"303030","one two "three" "four" ","five "six" ","",""
sed -i.bak -E 's/([^,"])""/\1" "/g' file