【发布时间】:2020-10-27 03:37:15
【问题描述】:
我有一个配置文件模板,我打算用它来创建一个 bash 脚本来自动执行安装任务,该文件有这样的内容 (config.conf):
...
bootstrap_servers => "HUB_NAMESPACE.servicebus.windows.net:9093"
...
我还从另一个类似这样的文件 (vars.conf) 中获取变量:
...
HUB_NAMESPACE:aNamespace
...
我想将HUB_NAMESPACE 替换为config.conf。如果我使用以下内容进行替换(文件中有几个HUB_NAMESPACE要替换):
HUB_NAMESPACE=$(awk -F: '/^.*HUB_NAMESPACE/{gsub(/ /,"",$2);print $2}' vars.conf)
sed -i 's^HUB_NAMESPACE^$HUB_NAMESPACE^g' config.conf
生成的文件将是这样的:
...
bootstrap_servers => "aNamespace
.servicebus.windows.net:9093"
...
由于aNamespace 和.servicebus.windows.net:9093" 之间的换行导致应用崩溃。
有没有办法在替换这种方式后防止插入换行符?是否有更好或更简单的解决方案来替换文件中的子字符串?
从这里提取的使用过的命令:
How get value from text file in linux
How to use sed to find and replace text in files
也试过了:
【问题讨论】:
-
tldr,但 shell 变量不会以单引号展开,这就是您现在所拥有的,请尝试在您的
sed代码中将单引号更改为双引号 -
修复
sed命令中的单引号后,我无法重现OP的现象,因为命令替换$(command)中的尾随换行符被删除。跨度>
标签: linux bash sed command-line ubuntu-18.04