2017-01-30 9 views
0

У меня есть следующие две строки в моем текстовом файлеenvsubst на основе строки

$MyEnv 
someText$MyEnv 

Я хочу использовать envsubst только заменить второй вхождение переменной MyEnv. Как я могу использовать строку «someText» для различения первого и второго вхождения переменной и замены в переменной env?

так envsubst <file1>file2

file 2 
$MyEnv 
someTextValueofMyEnv 

Как это возможно

ответ

1

Следующий код заменит все переменные окружения на второй строке ввода. Запрошенная команда envsubst является единственным не встроенным, который используется.

L=0 
while read line; do 
    L=$((L+1)) 
    if [ $L = 2 ]; then 
    echo "$line" |envsubst 
    else 
    echo "$line" 
    fi 
done <file1> file2 

Начните чтение с последней строки, поскольку это диктует входы и выходы; содержимое file1 считывается по строкам, заполняя $line для каждой итерации цикла while. Линии echo подаются по трубопроводу в file2.

У нас есть счетчик строк $L, который увеличивается в начале цикла. Если мы на линии 2, мы отправляем линию через envsubst. В противном случае мы просто сообщим об этом.

 

Вы также спросили, как можно использовать строку «SOMETEXT», чтобы различать вхождения. Я не совсем уверен, что вы имеете в виду под этим, но подумайте:

while read line; do 
    # $line contains the string 'someText$MyEnv' 
    # (literally: $line does not match itself when removing that string) 
    if [ "$line" != "${line#*someText\$MyEnv}" ]; then 
    echo "$line" |envsubst 
    else 
    echo "$line" 
    fi 
done <file1> file2 

 

Примечания: envsubst будет только заменить экспортируется переменными. Команда envsubst не переносима; это часть GNU gettext, и это не часть либо POSIX standard utilities, либо Linux Standard Base commands (LSB).

Чтобы быть полностью портативным (и полностью использовать sh builtins!), Вам нужно будет использовать eval, что небезопасно без большого количества дополнительных проверок.