Помощь оболочки для замены двойных кавычек

#linux #shell #sed

#linux #оболочка #sed

Вопрос:

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

 echo -e "nzsql -d $f1 -c" "alter table $f3.$f2 ALTER COLUMN $f4 SET DEFAULT $v5" 
  

Вывод таков:

 nzsql -d  DD  -c "alter table SCHEMA.DD ALTER COLUMN CD_ID SET DEFAULT '-9999' "
nzsql -d  DD  -c "alter table SCHEMA.DD ALTER COLUMN LMT_ID SET DEFAULT 99' "
nzsql -d  DD  -c "alter table SCHEMA.DD ALTER COLUMN PPN_TM SET DEFAULT "TIMESTAMP"('now(0)'::"VARCHAR") "
nzsql -d  DD  -c "alter table SCHEMA.DD ALTER COLUMN SRC_STM_ID SET DEFAULT '-9999' "
nzsql -d  DD  -c "alter table SCHEMA.DD ALTER COLUMN UNQ_ID_IN_SRC_STM SET DEFAULT 'MISSING_VALUE'::"NVARCHAR" "
nzsql -d  DD  -c "alter table SCHEMA.DD ALTER COLUMN END_DT SET DEFAULT '9999/12/31' "
nzsql -d  DD  -c "alter table SCHEMA.DD ALTER COLUMN EFF_DT SET DEFAULT '1900/01/01' "
nzsql -d  DD  -c "alter table SCHEMA.DD ALTER COLUMN ISRT_RUN_ID SET DEFAULT '-9999' "
nzsql -d  DD  -c "alter table SCHEMA.DD ALTER COLUMN UDT_RUN_ID SET DEFAULT '-9999' "
nzsql -d  DD  -c "alter table SCHEMA.DD ALTER COLUMN UDT_RUN_ID SET DEFAULT -9999 "
nzsql -d  DD  -c "alter table SCHEMA.DD ALTER COLUMN UDT_RUN_ID SET DEFAULT 9999 "
nzsql -d  DD  -c "alter table SCHEMA.DD ALTER COLUMN UDT_RUN_ID SET DEFAULT Now() "
nzsql -d  DD  -c "alter table SCHEMA.DD ALTER COLUMN LAST_VRSN_F SET DEFAULT '1' "
  

Я использую приведенную выше команду для подготовки инструкций alter table

Ниже приведены значения версии 5

 '-9999'
'-9999'
"TIMESTAMP"('now(0)'::"VARCHAR")
'-9999'
'MISSING_VALUE'::"NVARCHAR"
'9999/12/31'
'1900/01/01'
'-9999'
'-9999'
9999
Now()
now(0)
'1'
  

Что мне просто нужно сделать, так это если значения v5 имеют " , то просто замените это на " , а остальное, если оно имеет одинарные кавычки или без кавычек, должно просто оставаться неизменным.

Я пытался

 v5=`sed $v5/"/"`
  

и

 v5=`echo ${v5/"/"/}`
  

Не сработало.

Ответ №1:

Попробуйте это:

 v5="$(echo "$v5" | sed 's/"/\"/&')"

# this is your ori&inal command without any chan&es
echo -e "nzsql -d $f1 -c" "alter table $f3.$f2 ALTER COLUMN $f4 SET DEFAULT $v5" 
  

Объяснение:

  • echo "$v5" | sed : sed считывает $ v5 из STDIN;
  • 's/"/\"/ : замените " на " , но только для первого вхождения " в строке;
  • & : применяйте замену для каждого вхождения " в строке.

Если вы используете bash4 или выше, вы можете опустить echo :

 v5="$(sed 's/"/\"/&' <<<"$v5")"
  

Как вы упомянули в конце своего вопроса, вы можете опустить sed и использовать замену native bash :

 VAR="${VAR//"/\"}"