用bash / perl替换一行的一部分

时间:2012-02-19 21:50:28

标签: perl bash replace

我是bash的菜鸟,需要在文件中替换此行的mypassword部分

"rpc-password": mypassword

mynewpassword

我试过

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

但似乎什么也没做:( 我可以使用任何可以在bash脚本中运行的东西,它不必是bash或perl。

3 个答案:

答案 0 :(得分:7)

perl -pi -e 's/mypassword/mynewpassword/g' file

将起作用

答案 1 :(得分:4)

使用松散的正则表达式而不保留备份是坏主意。特别是如果您打算使用动态替换字符串。虽然它可能适用于"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)添加到正则表达式,这将允许变量插值,但转义元字符。

答案 2 :(得分:1)

您也可以使用sed:

sed -i 's/mypassword/mynewpassword/g' file