Como combinar um literal '*' com sed?

Como combinar um literal '*' com sed?

Eu tenho esta linha no meu arquivo chamada test.php

'dbs_password' => 'a8b*cyP0',

e deseja substituir em:

'dbs_password' => 'password-here',

Então eu uso este sedcomando com sintaxe:

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

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

Eu apreciaria se alguém pudesse compartilhar algum conhecimento sobre a maneira correta de usar sedesse tipo de código.

Responder1

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

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

No entanto, isso é desnecessariamente complexo. Se você quiser substituirtodas as ocorrênciasda string a8b*cyP0com password-here, você pode simplesmente fazer:

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

Se você quiser substituirapenasaquelas linhas que correspondem dbs_password, faça:

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

Esse último faz uso decaptura de padrãopara evitar imprimir o mesmo padrão duas vezes.

informação relacionada