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

Mr.*_*ing 2 bash perl replace

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

"rpc-password": mypassword
Run Code Online (Sandbox Code Playgroud)

mynewpassword

我试过了

perl -pi -e "s,PASSWORD,${password},g" "${user_conf}"
Run Code Online (Sandbox Code Playgroud)

但它似乎没有做任何事情:(我可以使用任何可以在bash脚本中工作的东西,它不必是bash或perl.

oua*_*uah 9

perl -pi -e 's/mypassword/mynewpassword/g' file
Run Code Online (Sandbox Code Playgroud)

将工作

  • @king 著名的遗言。它们可以包含正则表达式元字符吗? (3认同)

TLP*_*TLP 6

使用松散的正则表达式而不保留备份是一个坏主意。特别是如果您打算使用动态替换字符串。虽然它可能工作得很好,这样的事情"mypassword",这将打破,如果有人试图用密码替换"ass""butt"

"rpc-password": mypassword
Run Code Online (Sandbox Code Playgroud)

会成为:

"rpc-pbuttword": butt
Run Code Online (Sandbox Code Playgroud)

您寻求的自动化程度越高,您对正则表达式的要求就越严格,IMO。

我会将替换部分锚定到您寻求的特定配置行:

s/^\s*"rpc-password":\s*\K\Q$mypassword\E\s*$/$mynewpassword/
Run Code Online (Sandbox Code Playgroud)

没有/g修饰符,除非您打算在同一行上多次替换密码。\K将保留它之前的字符。\s*自由使用将防止用户编辑的配置文件可能添加了额外的空格。

此外,重要的是,您需要在密码中引用元字符。否则像这样的密码t(foo)?也会匹配单个t. 一般来说,它会导致奇怪的错配。这就是为什么我在正则表达式中添加\Q...\E(参见perldoc perlre),这将允许变量插值,但转义元字符。