如何使用shell脚本或python或perl替换源文件中的代码块

时间:2016-09-19 11:33:50

标签: python perl shell python-2.4

在我的源文件中,有多个if子句具有相同的检查。我想通过注释掉基于if语句后定义的文本的条件语句来使条件块之一始终执行。

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或shell脚本执行此操作?

我尝试了对我不起作用的perl命令,

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程序按预期工作,但认为它是解决方法,感觉可以有更好的解决方案。我不擅长shell脚本和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 :(得分:0)

  

我希望根据第二行文字值注释条件

我担心这是一个非常不明确的规范。请更加努力地解释您的文本需要发生什么。

这个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;
}