我尝试用sed命令替换.sql文件中的一行。
当我尝试“转义”该行的最后一个括号时遇到了一个问题。 我试图通过反跳来避免它,在它周围使用了简单和双引号,但是问题仍然存在。
sed -i "s|\(select dbms_metadata.get_ddl('PACKAGE',\).*|\1"'${var}','PRC_BNE_JZ') from dual;"|" backup_script.sql
实际结果是以下错误: 意外令牌')附近的语法错误
预期结果是了解我的错误。
答案 0 :(得分:1)
我会用单引号引起来的所有操作,以防止出现奇怪的扩展。要在字符串中使用单引号,请像在'\''
中那样使用' string '\'' rest of string '
。为了拥有一个变量,我像在'"$var"'
中一样使用' string '"$var"' rest of string
来使其正确扩展并与字符串的其余部分连接。
以下作品:
> var=var
> echo "select dbms_metadata.get_ddl('PACKAGE'," |
> sed 's|\(select dbms_metadata.get_ddl('\''PACKAGE'\'',\).*|\1'\'"${var}"\'','\''PRC_BNE_JZ'\'') from dual;|'
select dbms_metadata.get_ddl('PACKAGE','var','PRC_BNE_JZ') from dual;
但是在这种情况下使用"
可能更容易,因为字符串在各处都使用'
,例如:
sed "s|\(select dbms_metadata.get_ddl('PACKAGE',\).*|\1'${var}','PRC_BNE_JZ') from dual;|"
该错误来自无法解析参数的外壳。例如对于以下内容:
> echo abc)
main.sh: line 2: syntax error near unexpected token `)'
main.sh: line 2: `echo abc)'
您的命令中发生以下情况:
sed -i " bla bla "'${var}','PRC_BNE_JZ') from dual;"|" backup_script.sql
^^^^^^^^^^^^^^^^^
^^^^^^^^^^^^^ - could be 4th argument
^ - unquoted `)` is parsed by bash, as in subshell `( ... )`
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - 2nd argument
^^ - 1st argument to sed command
^^^ - run sed command
答案 1 :(得分:1)
未经测试,因为您没有提供任何要测试的示例输入/输出,但这可能正是您要寻找的:
sed -i 's/\(select dbms_metadata.get_ddl('\''PACKAGE'\'',\).*/\1'"${var}"','\''PRC_BNE_JZ'\'') from dual;/' backup_script.sql
请勿使用|
作为分隔符,因为它是ERE元字符,因此,如果您以后决定使用ERE(通过{{1} } arg)。
请始终在脚本和字符串周围使用单引号,除非您有非常特定的原因而不一定要这样做并且完全理解所有含义。