Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/ant/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
String ant-如何注释除与特定字符串匹配的行之外的所有行_String_Ant_Replace_Matching - Fatal编程技术网

String ant-如何注释除与特定字符串匹配的行之外的所有行

String ant-如何注释除与特定字符串匹配的行之外的所有行,string,ant,replace,matching,String,Ant,Replace,Matching,我想注释SQL脚本的所有行,除了那些包含字符串TABLE1(区分大小写)的行,如果可能的话,只使用单个ant任务(replaceregexp?)。 理想情况下,注释(以“-”开头)和空行应该被忽略,但如果不是,这就不那么重要了 例: 初始文件 CREATE TABLE TEST (TEST_ID VARCHAR(255) NOT NULL, TEST_NAME VARCHAR(255)); CREATE TABLE LICENSE (ID BIGINT NOT NULL GENERATED BY

我想注释SQL脚本的所有行,除了那些包含字符串TABLE1(区分大小写)的行,如果可能的话,只使用单个ant任务(replaceregexp?)。 理想情况下,注释(以“-”开头)和空行应该被忽略,但如果不是,这就不那么重要了

例: 初始文件

CREATE TABLE TEST (TEST_ID VARCHAR(255) NOT NULL, TEST_NAME VARCHAR(255));
CREATE TABLE LICENSE (ID BIGINT NOT NULL GENERATED BY DEFAULT AS IDENTITY, PRIMARY KEY (ID));

delete from TEST2 where
    ID = 'whatever'
;

delete from TEST3 where
    ENV = 'whatelse'
;

UPDATE TEST1 SET VERSION = '1.0';
最终文件

-- CREATE TABLE TEST (TEST_ID VARCHAR(255) NOT NULL, TEST_NAME VARCHAR(255));
-- CREATE TABLE LICENSE (ID BIGINT NOT NULL GENERATED BY DEFAULT AS IDENTITY, PRIMARY KEY (ID));

-- delete from TEST2 where
--  ID = 'whatever'
-- ;

-- delete from TEST3 where
--  ENV = 'whatelse'
-- ;

UPDATE TEST1 SET VERSION = '1.0';
我找到的唯一解决方案是: 1.注释掉脚本的所有行,然后取消注释与字符串TEST1匹配的行:

    <replaceregexp file="${sql.file}"
        match="(.*)"
        replace="-- \1"
        byline="true"
    />
    <replaceregexp file="${sql.file}"
        match="^-- (.*TEST1)"
        replace="\1"
        byline="true"
    />

  • 创建仅包含我要保留的行的新文件:

    <copy file="${sql.file}" tofile="${sql.file.bak}">
      <filterchain>
        <linecontains>
          <contains value="TEST1"/>
        </linecontains>
      </filterchain>
    </copy>
    
    
    
  • 我对这两种解决方案都不满意,因为: 解决方案#1。使用2个任务并更新同一文件两次 解决方案#2。删除我们希望保留为注释的其他行

    如果有人有正确的答案,我就接受

    谢谢, Sabrina

    一种解决方案可能是

    <replaceregexp file="${sql.file}"
         match="(^(?!$))(?!.*TEST1)"
         replace="-- \1"
         byline="true" />
    
    一个解决办法可能是

    <replaceregexp file="${sql.file}"
         match="(^(?!$))(?!.*TEST1)"
         replace="-- \1"
         byline="true" />
    

    为什么是蚂蚁?这是一个非常糟糕的脚本环境。Ant因为我别无选择,我被要求维护其他人用Ant编写的代码。你认为哪种语言最好?为什么是ANT?这是一个非常糟糕的脚本环境。Ant因为我别无选择,我被要求维护其他人用Ant编写的代码。你认为哪种语言最适合这样做?太好了,它很有魅力,非常感谢!不过我有几个问题:(^(?!$)是什么意思,^代表行的开头,$代表行的结尾?我不完全明白(尽管我猜)为什么。非常欢迎您的解释。好的,我理解:^(?!$)匹配非空行。进一步优化是可能的:因为在这种情况下\1总是扩展为空,您可以忽略它:最符合要求的答案似乎是:太好了,它像一个符咒一样工作,非常感谢!不过我有几个问题:(^(?!$)是什么意思,^代表行的开头,$代表行的结尾?我不完全明白(尽管我猜)为什么。非常欢迎您的解释。好的,我理解:^(?!$)匹配非空行。进一步优化是可能的:因为在这种情况下\1总是扩展为空,您可以忽略它:最符合要求的答案似乎是: