如何用空格替换变量的逗号分隔字符串?

How to replace a variable's comma-separated string with whitespaces?

我的 docker-入口点脚本中有以下代码:

  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

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

您可以使用参数扩展在变量扩展期间用 space 替换每个逗号:

sudo sed -i -e "s#%SERVICE_NAMES%#${SERVICE_NAMES//,/ }#g" /etc/someservice/someconfig.file

这并不比您开始时的风险更大,因为替换文本没有任何额外的 # 符号;请记住,如果您的任何主机名以 # 符号结尾,则 sed 命令将失败。

使用tr将逗号音译为空格

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

tr <character> <replacement-character>

tr 从标准输入(文件描述符 0/dev/stdin)获取输入,因此我们必须创建一个 Bash pipeline, use input redirection with process substitution,或使用此处字符串。

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

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

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

If pattern begins with ‘/’, all matches of pattern are replaced with string. Normally only the first match is replaced.

echo "${SERVICE_NAMES//,/ }"

更多 sed 个命令

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

为避免影响整个文件,我们可以单独调用sed,将$SERVICE_NAMES作为要操作的数据。我们可以用sed's y command$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"

利用其他脚本语言

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

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