35

簡単なBashスクリプトを書こうとしています。単純な「テンプレート」変数があります。

template = "my*appserver"

次に、値、、、またはget_env()を返す関数( )があります。呼び出してから文字列-変数を'の戻り値に置き換え、アスタリスクと交換したいと思います。それで:devqaliveget_envtemplateget_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

bash スクリプトでの文字列置換は、たとえば sed によって実現できます。

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の文字列置換よりもわずかに高速になるようです。そして、ここにはサブシェルはまったくありません!うわー、それは西洋で最高の方法です。

面白い。あなたが面白いものが好きなら、あなたは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 に答える
1

私はこのようなことをする必要がありましたが、変数を含めるためにsedとreplace句が必要でした。私はこれで終わった。

変数名は $puttyline です

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

そのため、 sed は[remote "origin"]一致を検索して記憶し、変数の内容を含む行を直後に挿入します$puttyline

ただし、$puttyline に、sed が反応する特殊文字 (\ や $ など) が含まれていると、見苦しくなります。sed への別の呼び出しで前にそれらをエスケープするか、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 に答える