[英]Find And Replace Value after colon in bash script
我有一个这样的文件
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
之后的值
查找键( 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
是)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.