0

ほとんどのコンテンツが静的であるが、いくつかの変数があるテンプレートテキストファイルがあるとしましょう。例えば

My favorite site is ${FAV_SITE}

FAV_SITEがstackoverflow.comに設定されているとしましょう:

export FAV_SITE=stackoverflow.com

変数が解決されたファイルの内容をSTDOUTに出力するにはどうすればよいですか?

My favorite site is stackoverflow.com

sedやawkのような派手なツールを使わずに?

4

4 に答える 4

2

これは、その仕事をするPerlのほとんど些細なことです。

#!/usr/bin/env perl
#
# Substitute environment variables into text

use strict;
use warnings;

while (<>)
{
    while (m/\${(\w+)}/g)
    {
        my $env = $1;
        if (defined $ENV{$env})
        {
            my $sub = $ENV{$env};
            s/\${$env}/$sub/g;
        }
    }
    print;
}

環境変数が定義されていない場合、${VARIABLE}表記は変更されません。

たとえば、入力データについて:

This is ${HOME} and so is this (${HOME}) and that's ${USER} and that's all.
This is ${UNDEFINED} and that is ${UNDEF} too.

出力は次のようになります。

This is /work4/jleffler and so is this (/work4/jleffler) and that's jleffler and that's all.
This is ${UNDEFINED} and that is ${UNDEF} too.

<>Perlはおそらくそれほどコンパクトではありませんが、読み取り演算子と一致、置換、および印刷演算子がデフォルト変数で機能することがわかっていれば、多かれ少なかれ理解できます$_


RHEL 5Linux(質問しないでください)でPerl 5.12.1(自家製)を使用して、私は以下を使用しました:

$ cat x3 
This is ${UNDEFINED} and that is ${UNDEF} too.
This is ${HOME} and so is this (${HOME}) and that's ${USER} and that's all.
$ perl subenv.pl x3
This is ${UNDEFINED} and that is ${UNDEF} too.
This is /work4/jleffler and so is this (/work4/jleffler) and that's jleffler and that's all.
$

ヒアドキュメントを使用してテンプレートを作成する場合は注意が必要です。シェルはそれらの変数も拡張します。

/usr/bin/perlまた、RHELマシンでPerl 5.8.8が見つかり、同じ出力が生成されました。Mac OS X10.7.5でPerl5.16.0もチェックし、対応する結果(別のホームディレクトリ)を確認しました。${USER}また、環境に設定されていないHP-UX11.00マシンでPerl5.6.1を見つけましたが、${HOME}正しく置き換えられました。

于 2012-10-02T22:46:05.860 に答える
1

テンプレートファイルをbashスクリプトにすることはできますか?

#!/bin/bash
# This is a template, execute it to get interpolated text:
cat <<HERE
My favorite site is ${FAV_SITE}
HERE

使用例:

export FAV_SITE=stackoverflow.com
bash ./template.txt.sh

(ああ、あなたはreddit.comにアクセスする必要があるかもしれません)

于 2012-10-02T22:21:31.083 に答える
0

常に注意してevalください、しかし:

while read l; do eval echo "\"$l\""; done < input-file

これは、入力を制御する場合にのみ使用してください。たとえば、入力に次のような行が含まれている場合、"; rm -rf /"このスクリプトを実行するのは最も残念です。

于 2012-10-02T23:08:52.510 に答える
0

Perlの使用:

#!/usr/bin/perl

use strict;

my $inFile = $ARGV[0];

print "\nInput File=".$inFile;

open(FILEHANDLE, "<$inFile") || die("Could not open file");

my @fileLines = <FILEHANDLE>;

my $rslt;

foreach my $line(@fileLines)
{
    #chomp($line);

    #print "\nLINE BEFORE=".$line;

    while($line =~ m/(\${\w+})/g)
    {
        if($1)
        {
            my $plchldr = $1;

            my $varName = $plchldr;

            $varName =~ s/(\$|{|})//g;

            my $varVal = $ENV{$varName};

            if($varVal)
            {
                $line =~ s/\Q$plchldr/$varVal/g;
            }
        }
    }

    $rslt .= $line;

    #print "\nLINE AFTER=".$line;
}

print "\nRESULT = ".$rslt;

close(FILEHANDLE);

print "\n";

exit(0);
于 2012-10-03T16:31:32.057 に答える