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

Fel*_*das 16 command-line scripts sed

我正在尝试编写以下 bash 脚本:

HOME_DIR=/opt/my_home
find ./CONFIG -type f -exec sed -i "s/_HOME_DIR_/$_HOME_DIR/g" {} \;
Run Code Online (Sandbox Code Playgroud)

我想在文件中更改的行是这样的:

users                   = "_HOME_DIR_/config/data/_DOMAIN_/users.conf"
Run Code Online (Sandbox Code Playgroud)

所以最终的结果一定是:

users                   = "/opt/my_home/config/data/_DOMAIN_/users.conf"
Run Code Online (Sandbox Code Playgroud)

但我不明白......我想这是因为转义字符......

任何人都可以透露一些信息吗?

谢谢

ste*_*ver 25

在替换字符串或模式字符串包含斜杠的情况下,您可以利用 GNU sed 允许替代命令的替代分隔符这一事实。分隔符的常见选择是管道字符|或哈希#-分隔符的最佳选择通常取决于正在处理的文件类型。在你的情况下,你可以尝试

sed -i "s#_HOME_DIR_#$HOME_DIR#"
Run Code Online (Sandbox Code Playgroud)

另请注意,您输入的变量名称 $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
Run Code Online (Sandbox Code Playgroud)

仅供参考,您可能希望避免在脚本中对用户变量使用全大写 - 它们应该保留用于系统变量。此外,g除非您想在一行上进行多次替换,否则不需要 switch。