如何用文件夹路径替换字符串

如何用文件夹路径替换字符串

我正在尝试编写以下 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" {} \;

相关内容