чайников - основы bash часть 2




Как заменить символ-заполнитель или слово в переменной значением из другой переменной в Bash? (6)

Bash может выполнять замену строк самостоятельно:

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

Дополнительную информацию о замене строк см. В расширенном руководстве по созданию сценариев bash .

Итак, для функции bash:

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

И использовать:

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

Я пытаюсь написать простой скрипт Bash. У меня есть простая переменная «шаблон»:

template = "my*appserver"

Затем у меня есть функция ( get_env() ), которая возвращает значения dev , qa или live . Я бы назвал get_env а затем string-заменил переменную get_env возвращаемым значением 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, который завершает это

Пример:

$ 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:/c\newtext: Rahul'  ./printName.txt

Во-вторых, если вы хотите найти строку и затем заменить ее на свою переменную, выполните следующие действия:

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

key="newtext: "

value=$(cat ./variableStoredHere.txt)

key+=$value

результатом для команды ниже будет старый текст: старый

echo $firstkey 

результатом для команды ниже будет newtext: Rahul

echo $key 


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

Мне нужно было сделать что-то подобное, но мне понадобилось sed и предложение replace, чтобы включить переменную. Я закончил с этим.

Где имя переменной $ puttyline

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

Поэтому sed ищет [remote "origin"] и запоминает совпадение, и вставляет строку сразу после, содержащую все, что находится в переменной $puttyline .

Это может быть уродливым, однако, если $ puttyline содержит любые специальные символы, на которые sed отреагировал бы, например \ или $. Вам нужно либо сбежать от них до другого вызова sed, либо ... сделать что-то умнее в bash, что я слишком дерьмова с bash, чтобы знать. Например, чтобы дважды избежать всех обратных косых черт:

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

Основываясь на @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")

Поскольку никто не упомянул об этом, это крутая возможность использования 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 "[email protected]"
}

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




replace