Вы можете использовать группы захвата, чтобы сопоставлять и заменять все, что находится между двойными кавычками, за которыми сразу же следуют двойные кавычки.
Регулярное выражение для сопоставления будет выглядеть примерно так: ("[^",]*")"
. Обратите внимание на две вещи: во-первых, "
сопоставляются буквально, а выражение в середине [^",]*
просто означает, что регулярное выражение будет соответствовать чему угодно, кроме "
или ,
. Это означает, что совпадающая строка не будет содержать кавычки внутри.
Наконец, круглые скобки представляют собой группу захвата, и мы можем ссылаться на все, что соответствует подрегулярному выражению между ()
с обратной косой чертой и числом. Например, \1
будет заменено на совпадение первой группы захвата, \3
— третьей и так далее.
Сценарий sed для того, что вам нужно, может выглядеть примерно так:
sed -re 's/("[^",]*")"/\1/g'
Посмотрите, как последняя двойная кавычка находится вне группы захвата, и она не будет заменена на \1
.
Группы захвата — это функция расширенных регулярных выражений (ERE), поэтому для их включения в sed необходим флаг -r
, иначе будут использоваться базовые регулярные выражения (BRE).
Обратите также внимание на /g
в конце. Это необходимо для того, чтобы sed мог сопоставлять и заменять более одного вхождения в одной строке.
Пример:
$ cat test
"ABC-DEF-d98263","12345678","176568981","","588","ABC-DEF-11947","","GAUZE PACKING STRIPS 1/4"","","","2019-02-04T19:09:00-05:00",""","XXX","XXX","2019-02-12T23:57:48-06:00"","XXX-XXX-176568981"
$ cat test | sed -re 's/("[^",]*")"/\1/g'
"ABC-DEF-d98263","12345678","176568981","","588","ABC-DEF-11947","","GAUZE PACKING STRIPS 1/4","","","2019-02-04T19:09:00-05:00","","XXX","XXX","2019-02-12T23:57:48-06:00","XXX-XXX-176568981"
19.10.2019
sed -i -re 's/("[^",]*")"/\1/g' file.csv
21.10.2019