Следующий код заменит все переменные окружения на второй строке ввода. Запрошенная команда 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
, что небезопасно без большого количества дополнительных проверок.