首页 > 解决方案 > sed - 删除一对双引号之间的所有分号

问题描述

我有一个脏的 csv 文件,其中包含带引号的分号的行。我正在尝试使用以下命令清除这些分号:

sed -rin 's/(^.*\;.*\;\".*)(\;)(.*\"\;.*$)/\1\3/' file

但不知何故,这并没有删除所有的分号。一些有问题的行如下所示:

;0;"One ▒;)";123; ... ; nth-1column;
;0;"Two ▒;)";456; ... ; nthcolumn;

何时应该清洁它们:

;0;"One ▒)";123; ... ; nth-1column;
;0;"Two ▒)";456; ... ; nthcolumn;

可能存在一些编码问题,但这应该被正则表达式忽略。我只对删除分号感兴趣,然后处理编码。

关于如何积极清除双引号中包含的所有分号的任何想法?

标签: linuxunixsed

解决方案


这可能对您有用(GNU sed):

sed -E ':a;s/^([^"]*("[^;"]*"[^"]*)*"[^";]*);/\1/;ta' file

从包含不在双引号之间的字符和不包含;' 后跟双引号的引号字符串和既不是双引号也不是分号的字符的每行的前面开始进行反向引用。如果下一个字符是分号,则删除它并重复直到失败,然后打印结果。

替代:

sed -E '/^([^"]*("[^";]*"[^"]*)*"[^";]*);/{s//\n\1/;D}' file

或者:

sed -E 's/^([^"]*("[^";]*"[^"]*)*"[^";]*);/\n\1/;T;D' file

编辑:

sed -nE '/^([^"]*("[^";]*"[^"]*)*"[^";]*);/{:a;s//\1/;ta;p}' file

推荐阅读