Заменить символ только между двойными -кавычками на sed или awk

Однажды я нашел ответ на Github , который решил проблему, постоянно пытаясь пропинговать сервер. Только когда проходит пинг, служба продолжается:

[Service]
ExecStartPre=/bin/sh -c 'until ping -c1 google.com; do sleep 1; done;'
ExecStart=

Я заменил google.comсвоим собственным сервером, потому что моему основному скрипту нужно было подключиться к моему серверу.

2
04.11.2021, 11:41
2 ответа

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

$ csvformat -D ';' file | tr,. | csvformat -d ';'
ID,PRICE,QUANTITY,ARRIVAL
01299,41.5,1,0
26528,412.03,0,0
38080,2.35,0,0
38081,2.35,0,0

Приведенная выше команда изменяет разделитель CSV с запятой по умолчанию на двоеточие с запятой -. Затем он меняет все оставшиеся запятые на точки, прежде чем снова заменить разделитель полей на запятую.

В качестве альтернативы можно преобразовать CSV в JSON с помощью csvjsonи изменить данные с помощью jq:

.
$ csvjson -I file | jq -r '(.[0] | keys_unsorted | @csv), (map(.PRICE |= sub(",";".") | [.[]] | @csv)[])'
"ID","PRICE","QUANTITY","ARRIVAL"
"01299","41.5","1","0"
"26528","412.03","0","0"
"38080","2.35","0","0"
"38081","2.35","0","0"

Передайте это черезcsvformat(без аргументов ), если хотите удалить ненужные кавычки.

Выражение jqсначала выводит заголовок, беря ключи из первого объекта во входном массиве. Затем он изменяет поле PRICEкаждого элемента (, заменяет запятую точкой )и форматирует значения как CSV для вывода.

Разница в эффекте между этим вторым вариантом и первым заключается в том, что мы всегда воздействуем только на столбец PRICE. Любые встроенные запятые в любом другом поле останутся нетронутыми.


Для справки, документ JSON, который jqполучает в качестве входных данных от csvjson, учитывая данные CSV в вопросе, будет

[
  {"ID":"01299","PRICE":"41,5","QUANTITY":"1","ARRIVAL":"0"},
  {"ID":"26528","PRICE":"412,03","QUANTITY":"0","ARRIVAL":"0"},
  {"ID":"38080","PRICE":"2,35","QUANTITY":"0","ARRIVAL":"0"},
  {"ID":"38081","PRICE":"2,35","QUANTITY":"0","ARRIVAL":"0"}
]
2
05.11.2021, 08:19

Настройка этого ответа на Удалить запятую между кавычками только в файле с разделителями-запятыми для решения awk:

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

где infileэто

ID,PRICE,QUANTITY,ARRIVAL
01299,"41,5",1,0
26528,"412,03",0,0
38080,"2,35",0,0
38081,"2,35",0,0

и результат

ID,PRICE,QUANTITY,ARRIVAL
01299,"41.5",1,0
26528,"412.03",0,0
38080,"2.35",0,0
38081,"2.35",0,0

Объяснение кода такое же, как и в упомянутом ответе, поэтому я не буду его повторять, за исключением того, что:

  • Разделитель выходных полей теперь "(, т.е. OFS='"'), вместо ничего (, т.е. OFS=''), и;
  • gsubтеперь меняет запятую(",")на точку(".")вместо ничего("")
0
05.11.2021, 09:53

Теги

Похожие вопросы