Comando Sed com 'caractere especial [fechado]

2

Estou tentando executar o seguinte comando do shell bash:

sed -i "s/\(update.*\)where / where primary_id = '$primary_id', /" *.php

Como você pode ver, há uma variável que estou inserindo usando sed - por exemplo, '$primary_id' . Depois de executar o comando, vejo que ' são exibidos, no entanto $primary_id está faltando.

Como posso lidar com caracteres especiais, como ' ?

    
por Shahrukh Khan 04.01.2016 / 06:21

3 respostas

4

Vamos tornar isso um pouco mais simples. Você deseja substituir cada ocorrência de a por '$b' (um dólar, um b entre aspas simples). c , a que a variável $b acontece se expande, não é o que você deseja.

b=c
sed -i "s/a/'$b'/g" *.php

O comando acima é semelhante ao que você está fazendo no seu problema. Como a string s/a/'$b'/g está entre aspas duplas, as variáveis são expandidas e a string de substituição é 'c' .

Se todo o comando sed estiver entre aspas duplas, você precisará sair de $ . Esta é uma solução:

sed -i "s/a/'\$b'/g" *.php\

Outra possibilidade é não citar nada, exceto para qualquer caracter que tenha um significado especial para o shell (não recomendado, mas pode ser perspicaz):

sed -i s/a/\'\$b\'/g *.php
    
por 04.01.2016 / 10:18
3

A menos que eu entenda mal, seu comando funciona exatamente como esperado:

$ cat test_file 
update name where a='b'
$ export primary_id="test"
$ sed -i "s/\(update.*\)where / where primary_id = '$primary_id', /" test_file
$ cat test_file 
update name  where primary_id = 'test', a='b'
    
por 04.01.2016 / 10:25
2

Caracteres especiais, precedidos por \ serão tomados literalmente.
(Como você fez com seus parênteses: ( \( \) )).

Deverá ter esta aparência: \' .
Se você achar que ainda não funciona, tente: '\'' .
Como alternativa, tente a seqüência de escape hexadecimal: \x27 .

Além disso, em relação sed : Coloque seu expressão com:
Single Citações (%código%). não Duplas ( 's/1/2/g' ) .

sed -i 's/\(update.\*\)where / where primary_id = \'$primary_id\', /' \*.php  

sed -i 's/\(update.\*\)where / where primary_id = '\''$primary_id'\'', /' \*.php

sed -i 's/\(update.\*\)where / where primary_id = \x27$primary_id\x27, /' \*.php
    
por 04.01.2016 / 08:51