Замените все запятые между двумя кавычками в скрипте bash - PullRequest
0 голосов
/ 21 мая 2019

Мне нужно, чтобы все "," между двумя "были заменены на"; "в скрипте bash. Я близок, но часы в интернете и stackoverflow привели меня к этому:

echo ',,Lung,,"Lobular, each.|lungs, right.",false,,,,"organ, left.",,,,,' | sed -r ':a;s/(".*?),(.*?")/\1;\2/;ta'

С результатом:

,,Lung,,"Lobular; each.|lungs; right.";false;;;;"organ; left.",,,,,

Правильно будет:

,,Lung,,"Lobular; each.|lungs; right.",false,,,,"organ; left.",,,,,

Ответы [ 2 ]

2 голосов
/ 21 мая 2019

Не уверен, как вы хотите иметь дело со строками, которые имеют нечетное число двойных кавычек (например, строка в двойных кавычках занимает несколько строк), но возможно:

awk '!(NR%2){gsub(",",";")} 1' RS=\" ORS=\"

Это просто обрабатывает "в качестве разделителя записей и выполняет замену только для нечетных записей.Кажется, работает как хотелось.(Или, скорее, это работает так, как вы, похоже, желаете!)

Как указывает oguz в комментарии, в конце выводится дополнительная ".Это можно исправить с помощью:

awk '!(NR%2){gsub(",",";")} {printf RFS $0} {RFS="\""}' RS=\"

, что немного страшнее, но более правильно.(или, скорее, менее правильно!) Если ваш входной поток заканчивается на ", эта кавычка будет усечена.Однако, если ваш ввод завершается новой строкой, а не ", это будет делать то, что вы хотите.

OTOH, вы можете просто захотеть сделать:

perl -wpE 'BEGIN{$/=\1}; y/,/;/ if $in; $in = ! $in if $_ eq "\""'

Чточитает один символ и использует простой конечный автомат.($_ является текущим символом, поэтому $in = ! $in меняет состояние, когда видна двойная кавычка, и транслитерация происходит только тогда, когда $in не равен нулю.)

1 голос
/ 21 мая 2019

Если вы / действительно / хотите использовать sed, вы можете заменить целую строку и включить в нее выражение типа ^(([^"]*"[^"*]")*[^"]*) в начале существующего выражения, чтобы гарантировать, что соответствующие кавычки являются «нечетными».

...