2016-09-19 3 views
1

ソースファイルに同じチェックを含む複数のif節があります。 if文の後に定義されたテキストに基づいて条件文をコメントアウトすることにより、条件付きブロックの1つを常に実行したい。シェルスクリプトまたはpythonまたはperlを使用してソースファイル内のコードブロックを置き換える方法

if [ "${SVR_GRP}" = "obi" ] ; then 
    EXTRA_JAVA_PROPERTIES="-Doracle.fusion.appsMode=true ${EXTRA_JAVA_PROPERTIES}" 
    export EXTRA_JAVA_PROPERTIES 
fi 

if [ "${SVR_GRP}" = "obi" ] ; then 
    EXTRA_JAVA_PROPERTIES="-DUseSunHttpHandler=true ${EXTRA_JAVA_PROPERTIES}" 
    export EXTRA_JAVA_PROPERTIES 
fi 

if [ "${SVR_GRP}" = "obi" ] ; then 
    EXTRA_JAVA_PROPERTIES="Doracle.fusion.appsMode=true ${EXTRA_JAVA_PROPERTIES}" 
    export EXTRA_JAVA_PROPERTIES 
fi 

#if [ "${SVR_GRP}" = "obi" ] ; then 
    EXTRA_JAVA_PROPERTIES="-DUseSunHttpHandler=true ${EXTRA_JAVA_PROPERTIES}" 
    export EXTRA_JAVA_PROPERTIES 
#fi 

と交換しますが、私はこの使用してperlの/ Pythonやシェルスクリプトを行うことができますどのように私を提案してくださいことはできますか?

私は期待通りに動作しますが、周りの仕事としてそれを検討し、より良い解決策があることができ感じる

perl -0pe '/if [ "${SVR_GRP}" = "obi" ] ; then\nEXTRA_JAVA_PROPERTIES="-DUseSunHttpHandler=true ${EXTRA_JAVA_PROPERTIES}"/#if [ "${SVR_GRP}" = "obi" ] ; then\nEXTRA_JAVA_PROPERTIES="-DUseSunHttpHandler=true ${EXTRA_JAVA_PROPERTIES}" 

Pythonプログラム、私のために動作しませんperlのコマンドを試してみました。私はシェルスクリプトとperlでうまくいきません。

file_loc = 'D:/official/workspace/pythontest/test/oops/test.sh' 
new_file_loc = 'D:/official/workspace/pythontest/test/oops/test1.sh' 


def modify(): 
    file = open(file_loc) 
    file2 = open(new_file_loc, 'w') 
    lines = [] 
    count = -1; 
    found = False 
    for line in file: 
     if str(line).strip() == 'if [ "${SVR_GRP}" = "obi" ] ; then': 
      count = 3; 
      lines.append(line) 
     else: 
      if str(line).strip() == 'EXTRA_JAVA_PROPERTIES="-DUseSunHttpHandler=true ${EXTRA_JAVA_PROPERTIES}"': 
       found = True 
      lines.append(line) 
      count = count - 1; 
     if (count == 0): 
      writeIntoFile(file2, lines, found) 
      found = False 
      count = -1 
      lines = [] 
     elif count < 0: 
      lines = [] 
      file2.write(line) 


def writeIntoFile(file, lines, found): 
    for line in lines: 
     if found == False: 
      file.write(line) 
     elif str(line).strip() == 'if [ "${SVR_GRP}" = "obi" ] ; then' or str(line).strip() == 'fi': 
      file.write('#' + line); 
     else: 
      file.write(line) 


modify() 
+1

何を試しましたか? –

+0

私はsedとperlコマンドperl -0pe '/ if ["$ {SVR_GRP}" = "obi"]を使って試しました。 \ nEXTRA_JAVA_PROPERTIES = " - DUseSunHttpHandler = true $ {EXTRA_JAVA_PROPERTIES}" /# "[$ {SVR_GRP}" = "obi"]の場合は、 \ nEXTRA_JAVA_PROPERTIES = " - DUseSunHttpHandler = true $ {EXTRA_JAVA_PROPERTIES}"しかし動作しませんでした –

+0

私はpythonでファイル全体を読み込み、新しいファイルに内容を書き込んで、次に見つかったテキストに基づいて内容を置き換えることができるオプションがあります。しかし、そこにもっと良い解決策があると感じる。 –

答えて

0

は、私は2番目の行のテキスト値に基づいて条件をコメントアウトしたい

私は、これは非常に不明確な仕様です怖いです。あなたのテキストに何が起こる必要があるかをもっと詳しく説明してください。

このPerlコードは、サンプル入力をサンプル出力に変換しますが、質問のあいまいさを考慮すると、正しい理由で適切な変換が行われているかどうかを知ることはできません。

これはUnixフィルタです(STDINから読み込み、STDOUTに書き込む)。

#!/usr/bin/perl 

use strict; 
use warnings; 

local $/ = ''; # Paragraph mode 

my %seen; 

while (<>) { 
    my $first_line = (split /\n/)[0]; 
    if ($seen{$first_line}++) { 
    s/^if\b/#if/m; 
    s/^fi\b/#fi/m; 
    } 

    print; 
} 
関連する問題