如何将变量中的占位符字符或单词替换为 Bash 中另一个变量的值



我正在尝试编写一个简单的Bash脚本。我有一个简单的"模板"变量:

template = "my*appserver"

然后我有一个函数(get_env())返回值devqalive。我想调用get_env,然后将template变量字符串替换为get_env的返回值,并将其替换为星号。所以:

# Returns "dev"
server = get_env
# Prints "mydevappserver"
template = string_replace(server, template)

或:

# This time, it returns "live"
server = get_env
# Prints "myliveappserver"
template = string_replace(server, template)

我应该使用什么来代替这个string_replace()函数来完成绑定?

Bash 可以自己做字符串替换:

template='my*appserver'
server='live'
template="${template/*/$server}"

有关字符串替换的更多详细信息,请参阅高级 bash 脚本指南。

所以对于 bash 函数:

function string_replace {
    echo "${1/*/$2}"
}

并使用:

template=$(string_replace "$template" "$server")

例如,bash脚本中的字符串替换可以通过sed来实现:

template=$(echo $template | sed 's/old_string/new_string/g')

这会将模板变量中的old_string替换为new_string。

没有人提到它,这里有一个很酷的可能性使用 printf .占位符必须是%s的,而不是*

# use %s as the place-holder
template="my%sappserver"
# replace the place-holder by 'whatever-you-like':
server="whatever-you-like"
printf -v template "$template" "$server"

做!

如果你想要一个函数来做到这一点(并注意所有其他提到函数的解决方案如何使用一个丑陋的子shell):

#!/bin/bash
# This wonderful function should be called thus:
# string_replace "replacement string" "$placeholder_string" variable_name
string_replace() {
    printf -v $3 "$2" "$1"
}
# How to use it:
template="my%sappserver"
server="whatever-you-like"
string_replace "$server" "$template" destination_variable
echo "$destination_variable"

完成(再次)!

希望你喜欢它...现在,根据您的需求进行调整!

备注。似乎这种使用 printf 的方法比 bash 的字符串替换略快。而且这里根本没有子壳!哇,这是西方最好的方法。

有趣。如果你喜欢有趣的东西,你可以把上面的函数写string_replace

string_replace() {
    printf -v "$@"
}
# but then, use as:
string_replace destination_variable "$template" "$server"

是的,要么像其他人所说的那样"sed",要么从 2 个单独变量中的模板开始并动态构造。

例如
templateprefix="my"
templatesuffix="appserver"
server=get_env
template=${templateprefix}${server}${templatesuffix}

根据@Spencer Rathbun响应,也可以通过以下方式完成此操作:

   function string_replace {
        #DOC: "${string/match/replace}"
        string=$1
        echo "${string/$2/$3}"
    }
    template='my__patternReplacing__appserver'
    match='__patternReplacing__'
    replace='live'
    template=$(string_replace "$template" "$match" "$replace")

我需要做这样的事情,但我需要 sed 和替换子句需要包含一个变量。我最终得到了这个。

变量名称$puttyline

sed "s/([remote .origin.])/1n$puttyline/"

因此,sed 搜索 [remote "origin"] 并记住匹配项,并在后面插入一行,其中包含变量 $puttyline 中的任何内容。

但是,如果$puttyline包含 sed 会响应的任何特殊字符(如 \ 或 $),这可能会变得丑陋。您必须在再次致电 sed 之前逃离它们,或者......在 bash 中做一些更聪明的事情,我对 bash 太糟糕了,不知道。例如,要对所有反斜杠进行双重转义:

sed 's/\/\\/g'

这是一个 bash 脚本来总结这一点

例:

$ search_and_replace.sh "test me out" "test me" ez
ez out

search_and_replace.sh

#!/bin/bash
function show_help()
{
  echo ""
  echo "usage: SUBJECT SEARCH_FOR REPLACE_WITH"
  echo ""
  echo "e.g. "
  echo ""
  echo "test t a                     => aesa"
  echo "'test me out' 'test me' ez   => ez out"
  echo ""
  exit
}
if [ "$1" == "help" ]
then
  show_help
  exit
fi
if [ -z "$3" ]
then
  show_help
  exit
fi
SUBJECT=$1
SEARCH_FOR=$2
REPLACE_WITH=$3
echo "$SUBJECT" | sed -e "s/$SEARCH_FOR/$REPLACE_WITH/g"
网上有很多

帖子,但对我来说效果很好,如下所示。

如果您想替换字符串,有两种方法可以实现此目的(我的旧字符串带有特殊字符:)使用文件中的另一个字符串,然后使用以下命令:

sed -i '/oldtext:/cnewtext: Rahul'  ./printName.txt

其次,如果你想搜索一个字符串,然后用你的变量替换它,那么这样做:

#here im concatinating two key + value(myvariable).
firstkey="oldtext: old"
key="newtext: "
value=$(cat ./variableStoredHere.txt)
key+=$value

以下命令的结果将是旧文本:旧

echo $firstkey 

以下命令的结果将是新文本:拉胡尔

echo $key 

sed -i "s/$firstkey/$key/g" ./printName.txt  

相关内容

  • 没有找到相关文章

最新更新