Shell正则表达式可以转义引号的开头和结尾

时间:2018-02-07 22:27:29

标签: regex bash shell

我有一个名为“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语法可能不是插入匹配的正确方法,但更重要的是(我试过硬编码那部分)整个脚本似乎不起作用。我尝试通过加倍反转来逃避反斜杠,但这也无济于事......

1 个答案:

答案 0 :(得分:1)

我认为在sedawk等外部工具中使用更好的解决方案(因此它适用于shdash等),它是&#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;'