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