Как сопоставить литерал «*» с помощью 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

Последний вариант используетзахват шаблоначтобы избежать повторной печати одного и того же шаблона.

Связанный контент