我正在尝试编写以下 bash 脚本:
HOME_DIR=/opt/my_home
find ./CONFIG -type f -exec sed -i "s/_HOME_DIR_/$_HOME_DIR/g" {} \;
我想要在文件中更改的行是这样的:
users = "_HOME_DIR_/config/data/_DOMAIN_/users.conf"
所以最终结果必须是:
users = "/opt/my_home/config/data/_DOMAIN_/users.conf"
但我没有明白...我猜这是因为转义字符......
有人可以解释一下吗?
谢谢
答案1
在替换字符串或模式字符串包含斜杠的情况下,您可以利用 GNU sed 允许替换命令使用替代分隔符这一事实。分隔符的常见选择是管道字符|
或哈希#
- 分隔符的最佳选择通常取决于正在处理的文件类型。对于您的情况,您可以尝试
sed -i "s#_HOME_DIR_#$HOME_DIR#"
还要注意,您输入了错误的变量名 $HOME_DIR(它不是以下划线开头)。
$ HOME_DIR=/opt/my_home
$ echo "_HOME_DIR_/config/data/_DOMAIN_/users.conf" | sed "s#_HOME_DIR_#$HOME_DIR#"
/opt/my_home/config/data/_DOMAIN_/users.conf
仅供参考,您可能希望避免在脚本中使用全大写字母来表示用户变量 - 它们应该保留用于系统变量。此外,g
除非您想在一行中进行多次替换,否则无需切换。
答案2
对变量“opt/home”进行硬编码将像这样工作..
find ./CONFIG -type f -exec sed -i "s/\_HOME\_DIR\_/opt\/home/g" {} \;