替换 Bash 变量中的字符

replace characters in Bash variable

我正在尝试用特定变量中的 _ 个字符替换所有 - 个字符。尝试使用 tr 函数。我错过了什么?

谢谢!

user@mbp-user ~ % echo $APP_ID
app1_someinfo_info-text_text-indfo_text
user@mbp-user ~ % APP_ID= $APP_ID tr - _
zsh: command not found: app1_someinfo_info-text_text-indfo_text
user@mbp-user ~ % APP_ID= $APP_ID tr "-" "_"
zsh: command not found: app1_someinfo_info-text_text-indfo_text
user@mbp-user ~ % 

尝试以下操作:

[user@host ~]$ APP_ID="app1_someinfo_info-text_text-indfo_text"
[user@host ~]$ APP_ID=$(echo $APP_ID | tr "-" "_")
[user@host ~]$ echo $APP_ID
app1_someinfo_info_text_text_indfo_text

尝试如下

echo $APP_ID | tr -- - _

为防止以 - 开头的参数被解释为可选参数,请使用 -- 指示可选参数的结尾。

后记

但这没关系。 tr - _ 按预期工作。问题是您没有为 tr.

的标准输入提供字符串

使用sed

$ sed 's/-/_/g' <<< "$APP_ID"
app1_someinfo_info_text_text_indfo_text

纯粹bash

$ APP_ID=${APP_ID//-/_}
$ echo $APP_ID
app1_someinfo_info_text_text_indfo_text

使用awk

$ awk '{gsub(/-/,"_")}1' <<< "$APP_ID"
app1_someinfo_info_text_text_indfo_text

您可以在纯 bash 中执行此操作,而无需调用任何其他进程。

$ APP_ID=app1_someinfo_info-text_text-indfo_text
$ echo $APP_ID
app1_someinfo_info-text_text-indfo_text
$ echo ${APP_ID//-/_}
app1_someinfo_info_text_text_indfo_text

或重新分配给同一个变量

$ APP_ID=${APP_ID//-/_}

具体来说,我们正在使用模式

name//pattern/string

将变量 name.

中所有出现的 pattern 替换为 string

有关详细信息,请参阅 Carl Albing Bash Cookbook 的第 5.18 节。