如何从猛砸另一个变量与值替换占位符或文字的变量?(How to replace placeholde

2019-07-04 12:45发布

我试图写一个简单的bash脚本。 我有一个简单的“模板”变量:

template = "my*appserver"

然后,我有一个函数( get_env()返回值devqa ,或live 。 我想打电话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()函数来完成的绑定?

Answer 1:

Bash可以自行完成的字符串替换:

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

见先进的bash脚本指南关于字符串替换的更多细节。

因此,对于一个bash函数:

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

而且使用方法:

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


Answer 2:

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

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

这将替换模板变量new_string old_string。



Answer 3:

由于没有人提到它,这是一个使用一个很酷的可能性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的字符串替换稍快。 还有的在这里都没有子shell! 哇,这是西部最好的方法。

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

string_replace() {
    printf -v "$@"
}

# but then, use as:
string_replace destination_variable "$template" "$server"


Answer 4:

是啊,无论是“sed的”为其他人所说的,或与您的模板在2个独立的变量开始构建的飞行。 例如

templateprefix="my"
templatesuffix="appserver"

server=get_env

template=${templateprefix}${server}${templatesuffix}


Answer 5:

基于@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")


Answer 6:

我需要做这样的事情,但我需要SED和替换,包括一个变量所需的条款。 我结束了这一点。

当变量名是$ puttyline

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

这么SED搜索[remote "origin"]并记住匹配,并在之后插入线,包含在变量无论是$puttyline

这可以变得丑陋但是如果$ puttyline包含的sed会有什么反应,如\ $或任何特殊字符。 你必须要么逃跑之前,他们与另一个调用sed或...做在bash一些更聪明的是我太蹩脚使用bash就知道了。 例如,双逃避所有的反斜线:

sed 's/\\/\\\\/g'


Answer 7:

下面是一个包装此一个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"


Answer 8:

有这么多的帖子在网上,但是这对我来说工作得很好的一个是如下。

有2种方式来实现这一点,如果你想更换一个字符串(我的老字符串是特殊字符:)在一个文件中的另一个字符串,然后使用此:

sed -i '/oldtext:/c\newtext: Rahul'  ./printName.txt

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

#here im concatinating two key + value(myvariable).
firstkey="oldtext: old"

key="newtext: "

value=$(cat ./variableStoredHere.txt)

key+=$value

下面的命令结果将oldtext:老

echo $firstkey 

导致下面的命令将是将newtext:拉胡

echo $key 


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


文章来源: How to replace placeholder character or word in variable with value from another variable in Bash?