Как я могу использовать SED для замены конкретного символа в подстроке - PullRequest
2 голосов
/ 19 октября 2019

Итак, у меня есть CSV-файл с несколькими строками, например

"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"
"ABC-DEF-d1494751","98765432","98765432","1073552394","284","ABC-DEF-77997","","ACE WRAP 3"","","","2015-10-29T18:45:00-07:00","Sent","XXX","XXX","2018-04-05T19:38:41-05:00","XXX-XXX-76954940"

. Я хотел бы заменить "", на ", только для столбца 8 или там, где после GAUZE PACKING STRIPS 1 /4 или ACE WRAP 3, не касаясь других "", в строке.

Пробовал sed 's/[[:alnum:]]""//g' file.csv, но он также удаляет <num>"".

Есть идеи? Очень признателен!

Ответы [ 2 ]

2 голосов
/ 19 октября 2019

Вы можете использовать группы захвата для сопоставления и замены всего, что находится между двойными кавычками и сразу же следует двойными кавычками.

Соответствующее регулярное выражение будет выглядеть примерно так: ("[^",]*")". Обратите внимание на две вещи: первая состоит в том, что " сопоставляются буквально, а выражение в середине [^",]* просто означает, что регулярное выражение будет соответствовать чему угодно, кроме " или ,. Это означает, что внутри сопоставленной строки не будет кавычек.

Наконец, круглые скобки представляют собой группу захвата , и мы можем ссылаться на все, что соответствует под Регексу между ()с обратной косой чертой и номером. Например, \1 будет заменено совпадением первой группы захвата, \3 с третьей и т. Д.

Сценарий sed для того, что вам нужно, может выглядеть примерно так:

sed -re 's/("[^",]*")"/\1/g'

Посмотрите, как последняя двойная кавычка находится вне группы захвата, и она не будет заменена на \1.

Группы захвата являются функцией расширенных регулярных выражений (ERE), поэтомуфлаг -r необходим для их включения в sed, в противном случае он будет использовать базовые регулярные выражения (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"
0 голосов
/ 19 октября 2019

Использование awk:

$ awk '
BEGIN { FS=OFS="," }           # set delimiters
{
    if($8!="\"\"")             # if $8 is not empty ie. ""
        sub(/\"\"$/,"\"",$8)   # replace trailing double quotes with a single double quote
}1' file                       # output

Вывод:

"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"
"ABC-DEF-d1494751","98765432","98765432","1073552394","284","ABC-DEF-77997","","ACE WRAP 3","","","2015-10-29T18:45:00-07:00","Sent","XXX","XXX","2018-04-05T19:38:41-05:00","XXX-XXX-76954940"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...