Shell脚本中将双引号替换为转义双引号的技术求助
解决NZSQL ALTER TABLE语句中v5变量的双引号转义问题
问题背景
你当前使用这条单行命令生成NZSQL的ALTER TABLE语句:
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") "
v5的可能取值包括:
'-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/"/\"/}`
失效原因
- sed命令语法错误:sed需要通过管道或文件接收输入,你直接将变量作为参数传递的写法不符合sed的语法,同时缺少
g标记(默认仅替换第一个匹配项)。 - bash参数扩展仅单次替换:
${v5/"/\"/}中的单个斜杠/只会替换第一个出现的双引号,无法处理v5中存在多个双引号的场景。
正确解决方案
方案1:使用bash内置参数扩展全局替换
bash的参数扩展支持全局替换,只需将单个斜杠改为两个斜杠//,即可替换所有匹配的双引号:
v5="${v5//\"/\\\"}"
这种方式无需调用外部工具,处理效率更高,适合纯bash脚本场景。
方案2:使用sed工具全局替换
如果你更习惯用sed处理文本,需要通过管道传递v5的内容,并添加g标记实现全局替换:
v5=$(echo "$v5" | sed 's/"/\\"/g')
注意必须给echo "$v5"加上双引号,避免v5中的空格或特殊字符被bash拆分。
修改后的完整命令示例
先对v5进行转义处理,再生成最终的NZSQL命令:
# 先执行双引号转义(二选一即可) v5="${v5//\"/\\\"}" # 或者 v5=$(echo "$v5" | sed 's/"/\\"/g') # 生成最终的ALTER TABLE命令 echo -e "nzsql -d $f1 -c \"alter table $f3.$f2 ALTER COLUMN $f4 SET DEFAULT $v5\""
测试验证:当v5取值为"TIMESTAMP"('now(0)'::"VARCHAR")时,处理后会变为\"TIMESTAMP\"('now(0)'::\"VARCHAR\"),生成的最终命令为:
nzsql -d DD -c "alter table SCHEMA.DD ALTER COLUMN PPN_TM SET DEFAULT \"TIMESTAMP\"('now(0)'::\"VARCHAR\") "
这样就不会出现引号冲突,能正确被NZSQL解析执行。
内容的提问来源于stack exchange,提问作者Dilu
相关产品推荐
相关产品推荐

