Regex 用于转义引号开头和结尾的Shell正则表达式

Regex 用于转义引号开头和结尾的Shell正则表达式,regex,bash,shell,Regex,Bash,Shell,我有一个名为query.sql的文件,其中包含一个sql查询,例如: select * from myTable where myVar='hello' and stuff=123; 当前,同一目录中的my bash脚本通过调用以下代码使用该查询: #!/bin/bash query=$(<query.sql) 到目前为止,我提出了以下建议,但不起作用: q2="${query//'([^']*)'/'\'$1\''}" 有两个潜在的问题:我的$1语法可能不是插入匹配项的正确方法,但

我有一个名为query.sql的文件,其中包含一个sql查询,例如:

select * from myTable where myVar='hello' and stuff=123;
当前,同一目录中的my bash脚本通过调用以下代码使用该查询:

#!/bin/bash
query=$(<query.sql)
到目前为止,我提出了以下建议,但不起作用:

q2="${query//'([^']*)'/'\'$1\''}"

有两个潜在的问题:我的$1语法可能不是插入匹配项的正确方法,但更重要的是,我尝试了对整个脚本中的该部分进行硬编码,但似乎不起作用。我试图通过将反斜杠加倍来避免反斜杠,但这也没有帮助…

我认为在sed或awkso等外部工具中使用更好的解决方案,它将与sh、dash、e.t.c一起使用,更便于携带。这是一个很好的做法-尽可能将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;'

你在这里的实际目标是什么?要生成shell脚本?如果您只想将文件内容作为文字参数传递,则根本不需要进行任何基于正则表达式的引用或转义,因此可能需要修改问题以解决此方法要解决的实际直接问题。顺便说一句,获取eval安全引用版本的标准方法是printf-v query_q“%q”$query,在此之后,您可以运行,比如bash-c echo$query_q,而不必担心查询中某处的$touch/tmp/i-pwned-you被执行,但它会发出一个字符串,该字符串只在将作为shell脚本一部分进行解析的上下文中使用,一般来说,应该避免这样的上下文,以利于从bash通常使之容易的代码中传递带外数据!。嗨,查尔斯,谢谢你的参与。我通过ssh发送这些命令,这是转义引号的方法。整个过程基本完成了,平台的大部分都不在我的掌控之中,因此将过程更改为另一种更好的方式是我无法控制的。然而,我非常确信,在regexps和/或sed方面比我更了解的人可以帮助我;我提供的printf%q方法在通过ssh发送命令时非常有效。如果您在问题中明确表示通过SSH发送是您的目标,我可以添加一个完整、直接且经过测试的答案。也就是说,SSH somehost echo$query\q,以及如上所述的从查询生成的查询,将正常工作,正如远程echo实现允许所有可能的查询值一样正常工作,只要远程shell是bash,无论是否处于POSIX模式;对于ssh,somehost'bash-i'感谢您的回答。在我这边,我在做一些事情,我似乎在做一些简单的事情,你能告诉我你的想法吗?q2=$sed's\\[^'\]*'\\'\\1\\'\'\'\\'查询。SQL对不起,复制/粘贴错误:q2=$sed's\\\[^'\]*'\\\\\'\\\'\\\\'\\\\\'\\\\\'\\\\\\'\\\\\\'\\\\\\'\\\\\\\\'查询。sqlI出现错误:。。。无效引用\1..,但我可以理解您试图实现的目标,并且它比'\\w\+\'regexp.sKwa要好得多,实际上我被函数推迟了,但现在我知道您展示了两种不同的解决问题的方法。我最喜欢第一个,它又漂亮又光滑。谢谢是的,你是对的,我将通过包含[^'\]而不是\w来结合这两个世界的优点
$ 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;'