【问题标题】:Replacing a part of a line with bash / perl用 bash / perl 替换一行的一部分
【发布时间】:2012-03-10 08:22:58
【问题描述】:

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

"rpc-password": mypassword

mynewpassword

我试过了

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

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

【问题讨论】:

    标签: perl bash replace


    【解决方案1】:

    使用松散的正则表达式而不保留备份是一个坏主意。特别是如果您打算使用动态替换字符串。虽然它可能适用于 "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】:

    您也可以为此使用 sed:

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

    【讨论】:

      【解决方案3】:
      perl -pi -e 's/mypassword/mynewpassword/g' file
      

      会起作用

      【讨论】:

      • 如果只是一个地方,则无需使用/g 修饰符。这也是脆弱的,因为它是松散的。例如s/bar/foo/g不仅会替换" bar",还会替换bartenderrhubarbbark等。
      • 没关系,密码是强密码 :) 没有机会更改其他内容
      • @king 著名的遗言。它们可以包含正则表达式元字符吗?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-11-07
      • 1970-01-01
      • 1970-01-01
      • 2017-10-09
      • 2017-04-30
      • 2013-10-05
      • 2017-06-18
      相关资源
      最近更新 更多