在bash脚本中冒号后查找并替换值

时间:2015-08-17 18:24:52

标签: bash

我有一个像这样的文件

parameters:
    database_host: 127.0.0.1
    database_port: null
    database_name: myDb
    database_user: root
    database_password: null
    mailer_transport: smtp
    mailer_host: 127.0.0.1
    mailer_user: null
    mailer_password: null
    secret: ea64f518be08e0d5895335990f10d984c22f400c
    name_db: newDB

这是一个yml文件,它有一个特定的格式

我想创建一个文件sh,在name_db之后使用参数

查找并替换该值

1 个答案:

答案 0 :(得分:3)

查找密钥(name_db:)并替换其后的值。假设sed支持-i选项:

sed -i.bak "/^[[:space:]]*name_db:/ s/:.*/: $newname/" file.yml

正则表达式/^[[:space:]]*name_db:/查找以零或多个空格开头,后跟name_db:的行。找到该行后,将执行s/:.*/: $newname/替换。它将用冒号,空格和$newname中的值替换冒号和后面的任何内容。如果$newname包含斜杠,则会失败。如果可能,请选择其他字符(/除外)作为标记。如有疑问, Control-A 非常有用,不太可能成为有效name_db值的一部分。

这并不关心旧值是什么。您可以简单地将整个表达式用双引号括起来,这会在$newname中插入值。然而,在sed脚本周围使用单引号通常是一个好主意。

monkeyUser评论道:

  

sed: 1: "file.yml": extra characters at the end of p command

请注意,显示的命令行(使用-i.bak)适用于Linux(GNU sed)和Mac OS X(BSD sed)。 GNU sed允许一个可选的备份后缀,如果它存在,必须附加到-i选项; BSD sed需要一个后缀,必须附加到-i选项,如图所示,或者可以是下一个参数。如果您不想使用GNU sed进行备份,请仅指定-i …;使用BSD sed,在''选项后将-i指定为空参数:-i '' …。鉴于错误消息sed: 1: "file.yml": extra characters at the end of p command,我怀疑代码是在具有BSD sed的系统上运行的,尽管我不太清楚为什么提到p(我怀疑有些编辑实际的错误消息)。这是:sed -i /something/ file.yml将使用BSD sed/something/视为备份文件后缀,然后查找file.yml被视为sed脚本的问题...除外我认为文件名以p而不是f开头,因为f不是sed命令(但p是)。