2013-10-18 44 views
0

我有一個conf文件,其格式爲variable =「value」,其中值也可能具有特殊字符。一個例子是線:基於conf文件替換文件的值

LINE_D = 「(L# 'ID' == '登錄')AND L#的 'id' IS NULL」

我有另一個文件F,其應該基於本CONF替換值文件。例如,如果F中 打印行 '$ LINE_D' 應該由 PRINT '(L#' 身份證 '== '登錄')和L# '身份證' 替代IS NULL'

如何我可以在shell腳本中獲取conf和F並在F中生成值。

感謝

回答

0

您所在的需要什麼的定義留下很多空白的,所以你可能需要調整這個腳本。它是最初設計用於處理makefile的更復雜腳本的精簡版本。這意味着可能有物質可以從這裏移除而不會造成麻煩,儘管我已經擺脫了大部分無關處理。

#!usr/bin/env perl 
# 
# Note: this script can take input from stdin or from one or more files. 
# For example, either of the following will work: 
# cat config file | setmacro 
# setmacro file 

use strict; 
use warnings; 
use Getopt::Std; 

# Usage: 
# -b -- omit blank lines 
# -c -- omit comments 
# -d -- debug mode (verbose) 
# -e -- omit the environment 

my %opt; 
my %MACROS; 
my $input_line; 

die "Usage: $0 [-bcde] [file ...]" unless getopts('bcde', \%opt); 

# Copy environment into hash for MAKE macros 
%MACROS = %ENV unless $opt{e}; 

my $rx_macro = qr/\${?([A-Za-z]\w*)}?/;  # Matches $PQR} but ideally shouldn't 

# For each line in each file specified on the command line (or stdin by default) 
while ($input_line = <>) 
{ 
    chomp $input_line; 
    do_line($input_line); 
} 

# Expand macros in given value 
sub macro_expand 
{ 
    my($value) = @_; 
    print "-->> macro_expand: $value\n" if $opt{d}; 
    while ($value =~ $rx_macro) 
    { 
     print "Found macro = $1\n" if $opt{d}; 
     my($env) = $MACROS{$1}; 
     $env = "" unless defined $env; 
     $value = $` . $env . $'; 
    } 
    print "<<-- macro_expand: $value\n" if $opt{d}; 
    return($value); 
} 

# routine to recognize macros 
sub do_line 
{ 
    my($line) = @_; 
    if ($line =~ /^\s*$/o) 
    { 
     # Blank line 
     print "$line\n" unless $opt{b}; 
    } 
    elsif ($line =~ /^\s*#/o) 
    { 
     # Comment line 
     print "$line\n" unless $opt{c}; 
    } 
    elsif ($line =~ /^\s*([A-Za-z]\w*)\s*=\s*(.*)\s*$/o) 
    { 
     # Macro definition 
     print "Macro: $line\n" if $opt{d}; 
     my $lhs = $1; 
     my $rhs = $2; 
     $rhs = $1 if $rhs =~ m/^"(.*)"$/; 
     $MACROS{$lhs} = ${rhs}; 
     print "##M: $lhs = <<$MACROS{$lhs}>>\n" if $opt{d}; 
    } 
    else 
    { 
     print "Expand: $line\n" if $opt{d}; 
     $line = macro_expand($line); 
     print "$line\n"; 
    } 
} 

給定的配置文件,cfg,含有:

LINE_D="(L#'id' == 'log') AND L#'id' IS NULL" 

和另一個文件,F,含有:

PRINT '$LINE_D' 
PRINT '${LINE_D}' 

perl setmacro.pl cfg F輸出爲:

PRINT '(L#'id' == 'log') AND L#'id' IS NULL' 
PRINT '(L#'id' == 'log') AND L#'id' IS NULL' 

這匹配所需的輸出,但給我heebie-jeebies多個單引號。但是,客戶永遠是對的!

(我想我擺脫了剩餘的Perl 4主義的;基本腳本仍然有遺留下來的少數殘餘,以及有關Perl 5.001如何處理事情不同的一些意見它使用$`$'通常是。不是一個好主意,但是它是有效的,所以修復這個問題是讀者的一個練習,正則表達式變量現在不是必需的;它同時也是make宏觀符號 - $(macro)以及${macro}