首页 > 解决方案 > 如何用空格替换变量的逗号分隔字符串?

问题描述

我的 docker-entrypoint 脚本中有以下代码:

  if [[ -v SERVICE_NAMES ]]; then
    sudo sed -i -e "s#%SERVICE_NAMES%#$SERVICE_NAMES#g" /etc/someservice/someconfig.file
  else
    echo "SERVICE_NAMES variable not set, unable to write config without"
    exit 1
  fi

变量“SERVICE_NAMES”的内容在容器启动时如下所示:

hostname1,hostname2,hostname3

使用我的 sed 命令,我想用 someconfig.file 中的占位符替换 SERVICE_NAMES 变量,但使用空格而不是逗号分隔,因此 SERVICE_NAMES 在我的 someconfig.file 中看起来像这样:

hostname1 hostname2 hostname3

在我写入文件之前是否可以用空格替换逗号?

标签: bashsedenvironment-variablesparameter-expansion

解决方案


用于将tr逗号转写为空格

tr命令可用于音译字符串(将字符串中的一个字符替换为另一个字符)。格式如下:

tr <character> <replacement-character>

tr从标准输入(文件描述符0/dev/stdin)获取其输入,因此我们必须创建一个Bash 管道,使用带有进程替换的输入重定向,或者使用一个 here-string。

# Pipeline
echo "$SERVICE_NAMES" | tr ',' ' '
# Input Redirection with Process Substitution
tr ',' ' ' <<(echo "$SERVICE_NAMES")
# Here-String
tr ',' ' ' <<<"$SERVICE_NAMES"

使用 Bash 的参数扩展将逗号扩展为空格

在 Bash 中,参数扩展可用于将所有逗号替换为空格。语法如下:${parameter/pattern/string}. 但是,您需要根据手册页确保您的模式以另一个正斜杠开头。

如果pattern以 '/' 开头,则所有匹配的pattern都将替换为string。通常只替换第一场比赛。

echo "${SERVICE_NAMES//,/ }"

更多sed命令

该命令可以通过添加更多参数或用(分号)分隔命令来连续sed执行多个命令,但是,添加的任何命令都将应用于整个文件。-e <command>;

为了避免影响整个文件,我们可以单独调用sedwith$SERVICE_NAMES作为要操作的数据。我们可以使用sed'y命令对 . 进行音译$SERVICE_NAMES

# Pipeline
echo "$SERVICE_NAMES" | sed -e 'y/,/ /'
# Input Redirection with Process Substitution
sed -e 'y/,/ /' <<$(echo "$SERVICE_NAMES")
# Here-String
sed -e 'y/,/ /' <<<"$SERVICE_NAMES"

使用其他脚本语言

我不会在这里提供其他脚本语言的示例,因为实在太多了。通常,大多数脚本语言支持字符串拆分、连接字符串、正则表达式、字符串/字符替换。这些语言的一些示例是 Python、JavaScript、AWK 和 Perl。

要使用脚本解决此类问题,您可以获取数据并将其直接放入将要执行的脚本中,将数据获取到标准输入(管道、输入重定向或此处字符串),或使用命令行参数.


推荐阅读