Sed выпуск круглых скобок - PullRequest
0 голосов
/ 18 января 2019

Я пытаюсь заменить строку в моем файле .sql командой sed.

Я столкнулся с проблемой, когда пытался "убежать" от последних скобок строки. Я пытался избежать этого с помощью обратной реакции, использовал простые и двойные кавычки, но проблема не решалась.

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

Фактическим результатом является следующая ошибка: синтаксическая ошибка рядом с неожиданным токеном `) '

Ожидаемый результат - понять мою ошибку.

Ответы [ 2 ]

0 голосов
/ 18 января 2019

Не проверено, поскольку вы не предоставили ни одного примера ввода / вывода для тестирования, но это может быть то, что вы ищете:

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

Не используйте | в качестве разделителя, так как он является метасимволом ERE, поэтому ваш код в лучшем случае сбивает с толку чтение и может вызвать проблемы, если / когда вы решите использовать ERE позже (через аргумент -E).

Всегда используйте одинарные кавычки вокруг сценариев и строк, если у вас нет очень конкретной причины, по которой вы не должны этого делать, и полностью понимаете все последствия.

0 голосов
/ 18 января 2019

Я делаю все в одинарных кавычках, чтобы не допустить странных расширений. Чтобы в строке была одинарная кавычка, я использую '\'', как в ' 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;|"

Ошибка происходит из оболочки, которая не может проанализировать аргументы. Ex. для следующего:

> 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...