リテラル '*' を sed と一致させるにはどうすればよいでしょうか?

リテラル '*' を sed と一致させるにはどうすればよいでしょうか?

私のtest.phpというファイルにこの行があります

'dbs_password' => 'a8b*cyP0',

次のように置き換えたい:

'dbs_password' => 'password-here',

したがって、私はこのsedコマンドを次の構文で使用します。

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

ただし、変更/置換は行われません。

sedこのような種類のコードを使用する適切な方法について、どなたか知識を共有していただければ幸いです。

答え1

問題は、*正規表現では を意味し0 or more of the preceeding character、リテラル を意味しないことです*。 にマッチさせるには*逃げるたとえば、次のようになります。

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

しかし、これは不必要に複雑です。すべての出現文字列a8b*cyP0を で囲む場合password-hereは、次のようにするだけです。

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

交換したい場合のみに一致する行はdbs_password、次の操作を実行します。

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

最後のはパターンキャプチャ同じパターンを2回印刷しないようにするためです。

関連情報