(非常好的第一篇文章!)
Try this
cat change_env.sh
#!/bin/bash
# spec : change_env.sh <environment> <property> <new value> <file.yml>
case ${#} in [!4] )
echo "usage: change_env.sh <environment> <property> <new value> <file.yml>" 1>&2
exit 1
;;
esac
env="$1" prop="$2" new="$3" file="$4"
bakFile="${file}".bak
mv "$file" "$bakFile"
sed '/^'"${env}"'/,/^[ ]*$/{ # [ spaceChar tabChar ]
/'"${prop}"'/s/\('"${prop}"'\)\(.*$\)/\1'"${new}"'/
}' "$bakFile" > "$file"
edit
请注意,如果您希望输入的值中包含空格,您需要修改脚本以引用所有变量(“$1”、“$2”...)。 (我现在已经这样做了,因为这是 shell 脚本的最佳实践)。
The /env/,/^[{space,tab}]*$/
是 sed 的范围地址。它读取包含您的环境设置的文本块。我假设您的示例输入是正确的,并且每个环境都由空行分隔。嗯...这将包括文件中的最后一个。
** 编辑**
感谢@posdef 指出了这个答案的一些问题。更新代码以解决特定情况。
即使在修复之后,我确实注意到给定一个像这样的输入
change_env.sh env2 prop2 "new value" file.yml
相关输出是
:prop2new value
因此,无需额外硬编码:
和空格字符到替换中,这意味着您需要非常详细地调用<property>
值和<new value>
, i.e.
change_env.sh env2 ":prop2: " "\"new value\"" file.yml
# note extra cruft-^^-----^^^--^^---------^^--------------
相关输出
env2:
:prop1: "value1"
:prop2: "new value"
:prop3: "value3"
...
:propn: "valuen"
IHTH