Ruby on rails 正在编写脚本以填充database.yml文件,并需要正则表达式来标识特定的留置权

Ruby on rails 正在编写脚本以填充database.yml文件,并需要正则表达式来标识特定的留置权,ruby-on-rails,regex,bash,shell,Ruby On Rails,Regex,Bash,Shell,我所处的处境与我所遇到的人非常相似。我正在尝试编写一个脚本来填充database.yaml文件中的值。问题是…我完全不明白作为解决方案发布的正则表达式中发生了什么 我要做的是为密码传递变量 如果我的数据库yml文件如下所示: development: database: sample_development password: # etc... test: database: sample_test password: # etc... 那么,如何创建一个查找“pas

我所处的处境与我所遇到的人非常相似。我正在尝试编写一个脚本来填充database.yaml文件中的值。问题是…我完全不明白作为解决方案发布的正则表达式中发生了什么

我要做的是为密码传递变量

如果我的数据库yml文件如下所示:

development:
  database: sample_development
  password:
  # etc...

test:
  database: sample_test
  password:
  # etc...
那么,如何创建一个查找“password:”的正则表达式,以便用“password:$new_password”替换它呢

对于脚本中设置开发密码的部分,我猜正则表达式将开始

/^development:
但我不知道如何记下下下一行“密码:”


你知道我该怎么做吗?

你可以使用sed脚本:

#!/bin/sed -f

: restart
/^development/ {
    : loop
    s/\(password:\).*/\1 new_password/
    t stop
    n
    /^[ \t]/ b loop
    i\  password: new_password
    b restart
} 
: stop
这里我们有一个sed脚本,当它找到以“development”开头的行时,它将启动主命令块。在解释命令的作用之前,我认为最好先解释一下标签。标签是用
命令定义的,它们为脚本中的某些位置命名。我们定义了3个标签

  • restart
    用于返回脚本的开头
  • 循环
    用于迭代
    开发
    块中的行
  • stop
    用于更改密码,然后转到脚本末尾,这实际上允许脚本在下一输入行重新启动
  • 在主块中,我们首先尝试使用
    s
    substitute命令应用密码更改。如果有效,则随后的
    t
    test命令将跳转到脚本末尾,以便在找到另一个
    开发
    块时继续执行

    如果替换命令未成功,则
    t
    命令不执行任何操作,我们继续执行
    n
    下一个命令。该命令将下一个输入行加载到模式空间(即sed的工作缓冲区)。然后我们检查它是否以空格或制表符开头,如果是,我们跳转到“循环”标签,让我们查看这一新行是否包含密码字段

    如果它不是以空白字符开头,那么我们已经到达了块的末尾。
    i
    insert命令是可选的,但是使用它我们可以在未找到密码行时在块的末尾添加密码行

    最后,由于我们到达了块的末尾,我们必须重新开始执行。我们可以让执行读取脚本的结尾,但是因为我们加载了一行不是以空格字符开头的新行,所以我们必须手动跳转到开头,以防止sed在重新启动之前加载另一行

    然后,您可以使用以下命令运行此脚本(假设它名为
    chg_passwd.sed
    ):


    希望这有帮助=)

    我只需要使用YAML库来读/写YAML文件:

    require 'yaml'
    database_config = YAML.load(File.open("<some path>/config/database.yml"))
    
    需要“yaml”
    database_config=YAML.load(File.open(“/config/database.yml”))
    
    然后修改一些值并将其写回fs:

    database_config['some_key'] = "some_value"
    File.open("<some path>/config/database.yml", "w") {|f| f.write(database_config.to_yaml) }
    
    database_config['some_key']=“some_value”
    打开(“/config/database.yml”,“w”){f | f.write(database_config.to_yaml)}
    
    您可以创建一个ruby脚本,该脚本将接受参数来设置密码、主机名等。除此之外,您可以在YAML文件中使用ruby使其成为动态的,YAML本身可以读取配置文件或环境变量,并使用它们来设置密码、主机名等

    host: <%= SERVER_CONFIG["dev_host"] %>
    
    主机:
    
    这可能适合您:

    database=foo newpassword=bar
    sed '/^'"${database}"'/,/^\s*$/s/password:/&'"${newpassword}"'/' file
    

    很酷。我只有指定文件名的sed脚本。在您的示例中,我将如何指定文件名?您好,我编辑了脚本以修复
    -f
    标志(它告诉sed执行文件中的命令),并添加了一个命令,以便在找不到密码行时插入密码行。然后我添加了对命令的解释。希望它能更清晰一点()拍得好,吻!这似乎是正确的方法。
    database=foo newpassword=bar
    sed '/^'"${database}"'/,/^\s*$/s/password:/&'"${newpassword}"'/' file