it-swarm.com.de

Wie kann man Platzhalterzeichen oder Word in Variablen durch einen Wert aus einer anderen Variablen in Bash ersetzen?

Ich versuche ein einfaches Bash-Skript zu schreiben. Ich habe eine einfache "template" Variable:

template = "my*appserver"

Ich habe dann eine Funktion (get_env()), die die Werte dev, qa oder live zurückgibt. Ich möchte get_env aufrufen und dann die Variable template durch den Rückgabewert von get_env durch String ersetzen und mit dem Sternchen austauschen. So:

# Returns "dev"
server = get_env

# Prints "mydevappserver"
template = string_replace(server, template)

Oder:

# This time, it returns "live"
server = get_env

# Prints "myliveappserver"
template = string_replace(server, template)

Was muss ich anstelle dieser string_replace()-Funktion verwenden, um die Bindung durchzuführen? 

29
IAmYourFaja

Bash kann selbst String ersetzen:

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

Weitere Informationen zum Ersetzen von Zeichenfolgen finden Sie im advanced bash scripting guide .

Also für eine Bash-Funktion:

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

Und zu verwenden:

template=$(string_replace "$template" "$server")
58
Spencer Rathbun

String-Ersetzung in einem Bash-Skript kann z. erreicht werden durch sed:

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

Dadurch wird old_string durch new_string in der Vorlagenvariablen ersetzt.

36
sge

Wie niemand erwähnt hat, ist hier eine coole Möglichkeit, printf zu verwenden. Der Platzhalter muss jedoch %s sein und nicht *.

# 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"

Erledigt!

Wenn Sie möchten, dass eine Funktion dies tut (und feststellen, wie alle anderen Lösungen, die eine Funktion erwähnen, eine unschöne Subshell verwenden)

#!/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"

Fertig (wieder)!

Ich hoffe, es hat Ihnen gefallen ... passen Sie es jetzt Ihren Bedürfnissen an!

Anmerkung. Diese Methode, die printf verwendet, scheint etwas schneller zu sein als die String-Ersetzung von bash. Und hier gibt es überhaupt keine Subshell! Wow, das ist die beste Methode im Westen.

Lustig. Wenn du lustiges Zeug magst, könntest du die Funktion string_replace oben als schreiben

string_replace() {
    printf -v "[email protected]"
}

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

Ja, entweder "sed", wie die anderen gesagt haben, oder Sie beginnen mit Ihrer Vorlage in 2 verschiedenen Variablen und konstruieren im Handumdrehen. z.B.

templateprefix="my"
templatesuffix="appserver"

server=get_env

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

Basierend auf der @Spencer Rathbun-Antwort kann dies auch folgendermaßen erfolgen:

   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")
1
iarroyo

Es gibt so viele Beiträge online, aber der, der für mich funktioniert hat, ist wie folgt.

Es gibt zwei Möglichkeiten, dies zu erreichen, wenn Sie eine Zeichenfolge (meine alte Zeichenfolge ist mit Sonderzeichen :) durch eine andere Zeichenfolge in einer Datei ersetzt werden soll.

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

Zweitens: Wenn Sie nach einer Zeichenfolge suchen und diese durch Ihre Variable ersetzen möchten, führen Sie folgende Schritte aus:

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

key="newtext: "

value=$(cat ./variableStoredHere.txt)

key+=$value

ergebnis für den folgenden Befehl ist oldtext: old

echo $firstkey 

ergebnis für den folgenden Befehl wird neuer Text sein: Rahul 

echo $key 


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

Hier ist ein Bash-Skript, das dies abschließt

Beispiel:

$ 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"
0
Brad Parks

Ich musste so etwas tun, aber ich brauchte sed und die Klausel replace, um eine Variable einzufügen. Ich endete damit.

Wo der Variablenname $ puttyline ist

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

Sed sucht also nach [remote "Origin"] und merkt sich die Übereinstimmung, und fügt direkt danach eine Zeile ein, die alles enthält, was in der Variablen $puttyline enthalten ist.

Dies kann jedoch hässlich werden, wenn $ puttyline Sonderzeichen enthält, auf die sed reagiert, wie\oder $. Sie müssen entweder vor ihnen mit einem weiteren Aufruf von sed entkommen oder ... etwas schlaueres in bash tun, das mir zu scheiße ist, um mit bash zu wissen. Um beispielsweise alle Backslashes doppelt zu entgehen:

sed 's/\\/\\\\/g'
0
Chris Moschini