2015-08-31 5 views
0

Итак, у меня есть некоторые файлы, содержащие значения заполнителя, такие как @[email protected] или @[email protected] (имена переменных all-caps, заключенные в @, представляющие имена переменных среды). Я хочу, чтобы заменить эти заполнители фактическими значениями переменных, которые они ссылаются.Как обрабатывать переменные в bash?

В прошлом, когда я видел такого рода вещи сделано, конкретные переменные, как правило, жестко, например:

sed -e 's/@[email protected]/$SOME_VALUE/' <infile >outfile 

Но это не будет работать для моего текущего потребительной случае, как я хотят более гибко поддерживать произвольные замены. Я написал этот код в Python, который делает именно то, что я хочу:

import re 
import fileinput 

from os import environ 
from sys import stdout 

pat = re.compile(r'@([A-Z_]+)@') 

for line in fileinput.input(): 
    stdout.write(pat.sub(lambda match: environ[match.group(1)], line)) 

Но я предпочел бы не использовать Python, если я могу помочь ему. Конечно, есть ли способ сделать это с помощью perl или sed one-liner?

ответ

3

perl -pe 's/\@(\w+)\@/$ENV{$1}/g' будет одним из способов выполнения этой работы.

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

perl -pe 's/\@(\w+)\@/die "$1 not found\n" unless exists $ENV{$1}; $ENV{$1}/eg' 
+0

Есть ли способ, чтобы сделать Perl жаловаться, если переменная не определена? Было бы лучше, чем молча оставить пробелы в моем файле, если мои env vars установлены неправильно. – robru

+0

@Robru обновлено с предложением – hobbs

+0

статус отказа от 'die' должен быть достаточным, чтобы выпустить' make'. – hobbs

0

Ах, это было слишком долго, так как я играл с Perl, это именно то, что я хочу:

perl -pe 's/@([A-Z_]+)@/$ENV{$1} or die "$1 undefined"/eg' <infile >outfile 

, а затем в Makefile вам нужно, чтобы избежать знаки доллара:

envsubst = perl -pe 's/@([A-Z_]+)@/$$ENV{$$1} or die "$$1 undefined"/eg' 

install: 
    $(envsubst) <infile1 >outfile1 
    $(envsubst) <infile2 >outfile2 
Смежные вопросы