【问题标题】:how to replace substring in file without newlines in bash?如何在没有换行符的情况下替换文件中的子字符串?
【发布时间】: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

也试过了:

Remove newline from unix variable

Using sed's append/change/insert without a newline

【问题讨论】:

  • tldr,但 shell 变量不会以单引号展开,这就是您现在所拥有的,请尝试在您的 sed 代码中将单引号更改为双引号
  • 修复sed命令中的单引号后,我无法重现OP的现象,因为命令替换$(command)中的尾随换行符被删除。跨度>

标签: linux bash sed command-line ubuntu-18.04


【解决方案1】:

我测试了您的命令,它在没有任何换行符的情况下完美运行,但在 sed 中用双引号替换单引号。

HUB_NAMESPACE="$(awk -F: '/^.*HUB_NAMESPACE/{gsub(/ /,"",$2);print $2}' vars.conf)"

sed -i "s^HUB_NAMESPACE^$HUB_NAMESPACE^g" config.conf

如果您遇到问题,请尝试以下解决方案: 使用 sed 和 awk 的简单单行程序,无需显式定义变量和就地文件编辑

sed -i "s/HUB_NAMESPACE/"$(awk -F: '/^.*HUB_NAMESPACE/{gsub(/ /,"",$2);printf "%s", $2}' vars.conf)"/g" config.conf

输出:

cat config.conf    
...
 bootstrap_servers => "aNamespace.servicebus.windows.net:9093" 
...

使用 printf 代替 print 可以防止换行符插入

【讨论】:

    猜你喜欢
    • 2021-08-10
    • 2021-01-20
    • 2015-02-12
    • 1970-01-01
    • 2010-11-11
    • 1970-01-01
    • 2022-01-03
    • 1970-01-01
    相关资源
    最近更新 更多