Замена отдельных символов в соответствующих разделителях в vim - PullRequest
0 голосов
/ 26 июня 2018

У меня есть CSV-файл, где некоторые ячейки содержат , между "...". Мне нужно изменить только запятые между кавычками на точки с запятой без замены остальных запятых в строке. То есть у меня что-то вроде этого:

x,"y,z",a

И только запятая между y и z должна быть заменена на ;. Как это сделать в vim?

Ответы [ 3 ]

0 голосов
/ 26 июня 2018

Эта команда vim :s с вызовом функции substitute() сделает работу легко:

%s/"\zs[^"]*/\=substitute(submatch(0),',',';','g')

Например:

enter image description here

0 голосов
/ 27 июня 2018

Если между двойными кавычками есть только одна запятая и не более одного совпадения в строке, должна работать следующая команда замены:

:%s/\(".*\),\(.*"\)/\1;\2/  
0 голосов
/ 26 июня 2018

Для одной пары цитат в строке вы можете использовать:

%s/\v("[^"]*)@<=,(.*")@=/;/g

Введите:

x,"y,z,a",b

Выход:

x,"y;z;a",b

Для более чем пары кавычек в строке вы можете использовать следующую команду awk:

:!awk -F'"' -v OFS='"' '{ for (i=2; i<=NF; i+=2) gsub(",", ";", $i) } 1' infile > outfile

Эта команда основана на вопросе в Unix StackExchange . Он установит кавычку " в качестве разделителя полей и подставит запятые в любое другое поле, используя gsub.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...