リテラル「*」を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*cyP0password-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回印刷するのを防ぎます。

関連情報