我有一个像这样的文件
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
之后使用参数
答案 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
是)。