Não é possível escapar de aspas simples no shell

3

Estou tentando fazer um comando para fazer uma substituição perl em um lote de arquivos php em um diretório. A string que eu quero substituir tem aspas simples nela, e eu não consigo fazer isso para escapar do shell.

Eu tentei ecoar a string com aspas sem escape, para ver o que o perl estaria recebendo:

echo 's/require_once\('include\.constants\.php'\);/require_once\('include\.constants\.php'\);require_once\("\./functions/include\.session\.inc\.php"\);/g'

e não tem as aspas simples no resultado:

s/require_once\(include.constants.php\);/require_once\(include.constants.php\);require_once\("\./functions/include\.session\.inc\.php"\);/g

No entanto, quando tento escapar das aspas simples:

echo 's/require_once\(\'include\.constants\.php\'\);/require_once\(\'include\.constants\.php\'\);require_once\("\./functions/include\.session\.inc\.php"\);/g'

Eu recebo o aviso para concluir o comando:

>

O que eu quero analisar é isso:

s/require_once\('include.constants.php'\);/require_once\('include.constants.php'\);require_once\("\./functions/include\.session\.inc\.php"\);/g

O que estou fazendo de errado?

    
por user13743 01.04.2010 / 17:22

4 respostas

1

Use " ao invés de ' do lado de fora, então você só precisa escapar de dois " dentro da expressão.

echo "s/require_once\('include.constants.php'\);/require_once\('include.constants.php'\);require_once\(\"\./functions/include\.session\.inc\.php\"\);/g"
    
por 01.04.2010 / 17:34
1

Nenhuma expansão ou avaliação de qualquer tipo ocorre dentro de uma cadeia de aspas simples, nem mesmo escapes de barra invertida. Como Nifle e Canen postaram, use aspas duplas e escape delas em vez das aspas simples. No entanto, você só precisa escapar deles para o benefício do seu shell. Se você planeja usar este s/// diretamente dentro de um script perl, nenhum escape é necessário porque você normalmente não colocaria s/// entre aspas para começar.

Além disso, sua operação s/// falhará porque você tem o caractere delimitador / em sua sequência de substituição. Ou barra invertida - escape das barras em /functions/include :

s/require_once\('include.constants.php'\);/require_once\('include.constants.php'\);require_once\("\.\/functions\/include\.session\.inc\.php"\);/g

ou escolha um delimitador diferente:

s@require_once\('include.constants.php'\);@require_once\('include.constants.php'\);require_once\("\./functions/include\.session\.inc\.php"\);@g
    
por 01.04.2010 / 17:42
0

Por que não usar aspas duplas?

"s/require_once\('include.constants.php'\);/require_once\('include.constants.php'\);require_once\("\./functions/include\.session\.inc\.php"\);/g"
    
por 01.04.2010 / 17:36
0

Você escapa aspas simples com aspas simples. Por exemplo, digamos que você queira fazer um git commit com a seguinte mensagem: Método save () atualizado do BaseActiveRecord.

Para fazer isso, execute o seguinte comando (e observe que eu escapei da aspa simples com uma aspa simples).

git commit -m 'Updated BaseActiveRecord''s save() method.'

Você também pode realizar sua meta usando aspas duplas (e não escapando do single):

git commit -m "Updated BaseActiveRecord's save() method."

No entanto, observe que as aspas duplas na linha de comando fazem com que alguns itens sejam expandidos (isto é, $ vars). Espero que isso ajude.

    
por 13.03.2013 / 16:49