Sed问题括号逸出

时间:2019-01-18 15:06:54

标签: bash sed

我尝试用sed命令替换.sql文件中的一行。

当我尝试“转义”该行的最后一个括号时遇到了一个问题。 我试图通过反跳来避免它,在它周围使用了简单和双引号,但是问题仍然存在。

sed -i "s|\(select dbms_metadata.get_ddl('PACKAGE',\).*|\1"'${var}','PRC_BNE_JZ') from dual;"|" backup_script.sql

实际结果是以下错误: 意外令牌')附近的语法错误

预期结果是了解我的错误。

2 个答案:

答案 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)。

请始终在脚本和字符串周围使用单引号,除非您有非常特定的原因而不一定要这样做并且完全理解所有含义。