Замена части строки с помощью bash / perl - PullRequest
2 голосов
/ 20 февраля 2012

Я новичок в bash, необходимо заменить mypassword часть этой строки в файле

"rpc-password": mypassword

с mynewpassword

Я пытался

perl -pi -e "s,PASSWORD,${password},g" "${user_conf}"

но, похоже, ничего не делает :( Я могу использовать все, что будет работать внутри скрипта bash, это не обязательно должен быть bash или perl.

Ответы [ 3 ]

8 голосов
/ 20 февраля 2012
perl -pi -e 's/mypassword/mynewpassword/g' file

будет работать

4 голосов
/ 20 февраля 2012

Использование свободного регулярного выражения без сохранения резервных копий - плохая идея . Особенно, если вы собираетесь использовать строки динамической замены. Хотя он может нормально работать для чего-то вроде "mypassword", он сломается, если кто-то попытается заменить его паролем "ass" на "butt":

"rpc-password": mypassword

станет:

"rpc-pbuttword": butt

Чем больше автоматизации вы ищите, тем строже вам нужно регулярное выражение, IMO.

Я бы привязал запасную часть к конкретной строке конфигурации, которую вы ищете:

s/^\s*"rpc-password":\s*\K\Q$mypassword\E\s*$/$mynewpassword/

Нет /g модификатор, если вы не собираетесь заменить пароль несколько раз в одной строке. \K сохранит символы перед ним. Свободное использование \s* будет защитой от файлов конфигурации, отредактированных пользователем, где возможно добавление лишних пробелов.

Также важно отметить, что в пароле нужно указывать метасимволы. В противном случае пароль, такой как t(foo)?, также будет соответствовать одному t. В общем, это вызовет странные несоответствия. Вот почему я добавил \Q...\E (см. perldoc perlre ) к регулярному выражению, что позволит выполнять интерполяцию переменных, но избегать метасимволов.

1 голос
/ 20 февраля 2012

Вы также можете использовать sed для этого:

sed -i 's/mypassword/mynewpassword/g' file
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...