35

我正在尝试编写一个简单的 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()函数来完成绑定?

4

8 回答 8

66

Bash 可以自己进行字符串替换:

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

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

所以对于 bash 函数:

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

并使用:

template=$(string_replace "$template" "$server")
于 2012-12-04T20:16:14.703 回答
39

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

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

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

于 2012-12-04T19:57:07.377 回答
7

正如没有人提到它,这是一个很酷的可能性,使用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"

完毕!

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

#!/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 的字符串替换稍快。而且这里根本没有 subshel​​l!哇,这是西方最好的方法。

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

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

# but then, use as:
string_replace destination_variable "$template" "$server"
于 2012-12-04T20:51:28.300 回答
3

是的,要么像其他人所说的那样'sed',要么从你的模板开始,使用 2 个单独的变量并即时构建。例如

templateprefix="my"
templatesuffix="appserver"

server=get_env

template=${templateprefix}${server}${templatesuffix}
于 2012-12-04T19:59:55.383 回答
2

根据@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")
于 2015-10-19T07:57:01.377 回答
1

我需要做这样的事情,但我需要 sed 并且 replace 子句需要包含一个变量。我结束了这个。

其中变量名是 $puttyline

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

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

但是,如果 $puttyline 包含任何 sed 会响应的特殊字符,例如 \ 或 $,这可能会变得很难看。您必须先通过再次调用 sed 来逃避它们,或者......在 bash 中做一些更聪明的事情,我对 bash 太蹩脚了,不知道。例如,要对所有反斜杠进行双重转义:

sed 's/\\/\\\\/g'
于 2013-10-07T03:50:24.807 回答
0

这是一个将其包装起来的 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"
于 2016-02-16T18:09:43.163 回答
0

网上有很多帖子,但对我来说效果很好的帖子如下。

有两种方法可以实现这一点,如果你想用文件中的另一个字符串替换一个字符串(我的旧字符串是特殊字符:),那么使用这个:

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: old

echo $firstkey 

以下命令的结果将是 newtext: Rahul

echo $key 


sed -i "s/$firstkey/$key/g" ./printName.txt  
于 2018-04-17T14:24:17.060 回答