#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//"/\"}"