Como combinar um literal '*' com sed?

1

Eu tenho essa linha no meu arquivo chamado test.php

'dbs_password' => 'a8b*cyP0',

e deseja substituir:

'dbs_password' => 'password-here',

Então eu uso este comando sed com sintaxe:

$ sed -e "s:'dbs_password' => 'a8b*cyP0',:'dbs_password' => 'password-here':" -i test.php

No entanto, isso não muda / é substituído.

Eu agradeceria se alguém pudesse compartilhar algum conhecimento sobre a maneira correta de usar sed para esse tipo de código?

    
por James W. 19.09.2013 / 06:02

1 resposta

4

O problema é que * em expressões regulares significa 0 or more of the preceeding character , isso não significa literal * . Para corresponder a um * , você precisa escape Por exemplo:

sed -i "s:'dbs_password' => 'a8b\*cyP0',:'dbs_password' => 'password-here':" test.php

Isto é desnecessariamente complexo no entanto. Se você quiser substituir todas as ocorrências da string a8b*cyP0 por password-here , basta fazer:

sed -i "s:a8b\*cyP0:password-here:" test.php

Se você quiser substituir somente as linhas que correspondem a dbs_password , faça:

sed -i "s:\(.*dbs_password.*\)'a8b\*cyP0':'password-here':" test.php

Esse último faz uso da captura padrão para evitar a impressão do mesmo padrão duas vezes.

    
por 19.09.2013 / 07:09