【发布时间】:2012-03-10 08:22:58
【问题描述】:
我是 bash 的菜鸟,需要替换文件中这一行的 mypassword 部分
"rpc-password": mypassword
mynewpassword
我试过了
perl -pi -e "s,PASSWORD,${password},g" "${user_conf}"
但它似乎没有做任何事情:( 我可以使用任何可以在 bash 脚本中工作的东西,它不必是 bash 或 perl。
【问题讨论】:
我是 bash 的菜鸟,需要替换文件中这一行的 mypassword 部分
"rpc-password": mypassword
mynewpassword
我试过了
perl -pi -e "s,PASSWORD,${password},g" "${user_conf}"
但它似乎没有做任何事情:( 我可以使用任何可以在 bash 脚本中工作的东西,它不必是 bash 或 perl。
【问题讨论】:
使用松散的正则表达式而不保留备份是一个坏主意。特别是如果您打算使用动态替换字符串。虽然它可能适用于 "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),这将允许变量插值,但转义元字符。
【讨论】:
您也可以为此使用 sed:
sed -i 's/mypassword/mynewpassword/g' file
【讨论】:
perl -pi -e 's/mypassword/mynewpassword/g' file
会起作用
【讨论】:
/g 修饰符。这也是脆弱的,因为它是松散的。例如s/bar/foo/g不仅会替换" bar",还会替换bartender、rhubarb、bark等。