如何用空格替换变量的逗号分隔字符串?
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。
为了使用脚本解决此类问题,您可以获取数据并将其直接放入将要执行的脚本中,将数据获取到标准输入(管道、输入重定向或此处字符串),或者利用命令行参数。
我的 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 ofpattern
are replaced withstring
. 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。
为了使用脚本解决此类问题,您可以获取数据并将其直接放入将要执行的脚本中,将数据获取到标准输入(管道、输入重定向或此处字符串),或者利用命令行参数。