Это может сработать для вас (GNU sed):
sed -E ':a;s/^([^"]*("[^"$]*"[^"]*)*"[^"$]*)\$([^" ]*) /\1" .. \3 .. " /;ta;s/^([^"]*("[^"$]*"[^"]*)*"[^"$]*)\$([^"]*)"/\1" .. \3/;ta' file
При изменении вещей в двойных кавычках сначала мы должны пропустить любые строки в двойных кавычках, которые не нуждаются в изменении.Это означает привязку регулярного выражения к началу строки с использованием метасимвола ^
и повторение регулярного выражения до тех пор, пока не прекратятся все случаи.
Сначала удалите ноль или более символов, которые не являются двойными кавычками с началастрока.
Во-вторых, исключите строки в двойных кавычках, которые не содержат символа интереса (TCOI), например $
, за которым следует ноль или более символов, которые не являются двойными кавычками, ноль или более раз.
В-третьих, исключите двойные кавычки, за которыми следуют ноль или более символов, которые не являются двойными кавычками или TCOI, т.е. $
.
Следующий символ (если он существует) должен быть TCOI.Сгруппируйте всю коллекцию строк ранее в обратной ссылке \1
.
После TCOI может быть сгруппировано одно или несколько условий.В приведенном выше примере первое условие - когда за переменной (начиная с TCOI) следует пробел.Второе условие - когда за переменной следует непосредственно "
.Следовательно, это влечет за собой две команды подстановки, команду ta
, переходящую к циклу, идентифицированному a
, когда подстановка прошла успешно.
NB Ситуацию if [ $VARIABLE = 1 ]; then
можно обработать в одном и том же месте, здесь [
- это открывающая двойная кавычка, а ]
- это закрывающая двойная кавычка.
PS TCOI был $
, и это также метасимвол в регулярном выражении, представляющий конец строки, поэтому он должен бытьнапример, \$
PPS Не забудьте также указать [
и ]
.Если цитирование не ваше, заключите символ в [x]
, где x - это символ для кавычки.
РЕДАКТИРОВАТЬ:
sed -E ':a;s/^([^"]*("[^"$]*"[^"]*)*"[^"$]*)\$([[:alnum:]]*)/\1" .. \3 .. "/;ta' file
Поскольку исходный пример был заменен на OPВот решение, основанное на новом примере.