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


14

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

但是我没有得到...我想这是因为逃逸字符...

谁能阐明一些想法?

谢谢


您的意思是,有些光
Alexandre Holden Daly 2014年

Answers:


23

在替换字符串或模式字符串包含斜杠的情况下,您可以利用以下事实: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除非您要在一行上进行多次替换,否则不需要切换。


0

对变量“ opt / home”进行硬编码将像这样..

find ./CONFIG -type f -exec sed -i "s/\_HOME\_DIR\_/opt\/home/g" {} \;
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.