bash - 如何用空格替换变量的逗号分隔字符串?
问题描述
我的 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
在我写入文件之前是否可以用空格替换逗号?
解决方案
用于将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>
;
为了避免影响整个文件,我们可以单独调用sed
with$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。
要使用脚本解决此类问题,您可以获取数据并将其直接放入将要执行的脚本中,将数据获取到标准输入(管道、输入重定向或此处字符串),或使用命令行参数.
推荐阅读
- javascript - for循环不会在javascript启动时运行
- react-native - 我们可以在swift中控制for循环的流程吗(调度组)
- python - 为什么在 LSTM 中添加 relu 激活后会得到 Nan?
- sip - 收到的 INVITE 中电话事件的错误 fmpt
- bayesian - 用于离散混合模型的 Stan 与 PYMC3
- python - Pandas 找不到 .xlsx 文件。有没有办法让它工作?
- python - 如何使用 python 为简单的正弦波输入生成反冲信号?
- vb.net - 来自文本文件的矩阵
- python - 如何从 csv 文件中的一行读取 JSON 字符串?
- javascript - 为什么不能在 vue 模板中使用窗口?