我有一个名为“query.sql”的文件,其中包含一个SQL查询,例如:
select * from myTable where myVar='hello' and stuff=123;
目前,我的bash脚本(在同一目录中)通过调用以下代码来使用该查询:
#!/bin/bash
query=$(<query.sql)
现在,我希望(在同一行中,或在如下的新行中)解析该查询以开始/结束方式转义引号。这很重要,因为我不是简单地用反斜杠+引号替换每个引号。起始报价与结束报价的处理方式不同。这是期望的结果应该是什么(我仔细检查,虽然这很奇怪,这实际上是我需要这些报价的顺序):
select * from myTable where myVar='\'hello\'' and stuff=123;
到目前为止,我想出了以下内容,但它不起作用:
q2="${query//'([^']*)'/'\'$1\''}"
有两个潜在的问题:我的$ 1语法可能不是插入匹配的正确方法,但更重要的是(我试过硬编码那部分)整个脚本似乎不起作用。我尝试通过加倍反转来逃避反斜杠,但这也无济于事......
答案 0 :(得分:1)
我认为在sed
或awk
等外部工具中使用更好的解决方案(因此它适用于sh
,dash
等),它是&#39 ;更具可移植性(作为一种良好做法 - 尽可能使用sh
Bash
语法。
$ cat /tmp/query.sql
select * from myTable where myVar='hello' and stuff=123;
$ sed "s:'\(\w\+\)':\'\\\'\1\\\'\':" < /tmp/query.sql
select * from myTable where myVar='\'hello\'' and stuff=123;
# quote function
quote ()
{
local quoted="${1//\'/\'\\\'\'}";
printf "'%s'" "$quoted"
}
$ quote "$(cat /tmp/query.sql)"
'select * from myTable where myVar='\''hello'\'' and stuff=123;'