Заменить строку Sed с помощью переменной окружения - PullRequest
0 голосов
/ 13 сентября 2018

У меня есть ситуация, когда переменные задаются в среде, и я должен заменить эти переменные в файле на их значение.

Например, у меня есть множество переменных, но немногие из них являются FRUIT = APPLE,TIME = DAILY.Содержимое текстового файла:

. $$ FRUIT $$ полезен для здоровья.Каждый должен есть $$ FRUIT $$ $$ TIMES $$.

Теперь я хочу, чтобы команда sed искала любую строку в $$$$ и использовала ее как переменную env для получения значения и замены.это в файле.

ЯБЛОКО полезно для здоровья.Каждый должен есть APPLE DAILY.

Я пробовал sed -i -E "s|$$([A-Z]+)$$|${\1}|g" test.txt и несколько других комбинаций, но это не работает.

это дает мне ошибку -bash: s|$$([A-Z]+)$$|${\1}|g: bad substitution

Ответы [ 3 ]

0 голосов
/ 13 сентября 2018

Это связано с ответом на Как я могу на лету интерпретировать переменные в скрипте оболочки? - этот вопрос не совсем дублирует этот.

При условии, чтопеременные являются частью окружения:

export FRUIT="APPLE"
export TIMES="DAILY"

Вы можете использовать инструмент envsubst GNU для замены переменных:

echo 'The $$FRUIT$$ is good for health. Everyone should eat $$FRUIT$$ $$TIMES$$.' | sed -E 's/\$\$([A-Z]+)\$\$/${\1}/g' | envsubst
The APPLE is good for health. Everyone should eat APPLE DAILY.

Обратите внимание, что вам необходимо поставить обратную косую черту передсимвол $, так как этот символ имеет значение для sed.

0 голосов
/ 13 сентября 2018

Вот как это сделать только с sed и grep

list=$(grep -wo "\\$\S\S*\\$" test2 | sort -u | tr '$' '\n');
for thing in ${list[@]}; do sed -i 's/\$\$'$thing'\$\$/'$"${!thing}"'/g' test2; done

Ниже приведено пояснение (самоочевидно)

user$ echo $TIMES
DAILY
user$ echo $FRUIT
APPLE
user$ cat test2 
The $$FRUIT$$ is good for health. Everyone should eat $$FRUIT$$ $$TIMES$$.
user$ list=$(grep -wo "\\$\S\S*\\$" test2 | sort -u | tr '$' '\n'); 
user$ echo $list
FRUIT TIMES
user$ for thing in ${list[@]}; do sed -i 's/\$\$'$thing'\$\$/'$"${!thing}"'/g' test2; done
user$ cat test2 
The APPLE is good for health. Everyone should eat APPLE DAILY.
0 голосов
/ 13 сентября 2018

Это связано с моим ответом на Как я могу на лету интерпретировать переменные в скрипте оболочки? - этот вопрос не вполне , дубликат этого.

str='The $$FRUIT$$ is good for health. Everyone should eat $$FRUIT$$ $$TIMES$$'
FRUIT=APPLE
TIMES=DAILY

while [[ $str =~ ('$$'([[:alnum:]_]+)'$$') ]]; do
    str=${str//${BASH_REMATCH[1]}/${!BASH_REMATCH[2]}}
done

echo "$str"
The APPLE is good for health. Everyone should eat APPLE DAILY

Мы ищем строку шаблона, захватывая всю строку со знаками доллара, а также фиксируем только имя переменной внутри. Затем мы используем расширение параметра оболочки, чтобы заменить совпавшую строку шаблона значением переменной, используя расширение косвенной переменной .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...