首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用awk在ant build文件目标范围内插入一行

如何使用awk在ant build文件目标范围内插入一行
EN

Stack Overflow用户
提问于 2012-08-22 08:34:43
回答 5查看 907关注 0票数 1

我需要有关使用awk (更好)、sed或perl的解决方案的帮助。解决方案应该在bash脚本中进行交互。这是我的问题,我需要在ant build文件目标的目标中插入一行,如下所示:

代码语言:javascript
复制
<target name="-AAAA" unless="non_AAAA_buildpackage">
              <antcall target="init"/>
              many antcall lines
</target>
<target name="-XXXX" unless="non_XXXX_buildpackage">
              <antcall target="init"/>
              many antcall lines here
              The line should be inserted here  as <antcall target="ZZZZ"/>
</target>
<target name="-BBBB" unless="non_BBBB_buildpackage">
              <antcall target="init"/>
              many antcall lines here
</target>
many targets here as this is a large file

请注意,该build.xml文件中有许多目标名称,但name="XXXX"始终是唯一的。所有其他目标的结束分隔符与</target>相同。请注意,应该在行之前插入行. </target>请注意,build.xml是一个包含多个目标的泻湖文件,单词“name=”-XXXX是唯一的,但不是"-XXXX"

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2012-08-22 08:56:27

简单的Perl解决方案:使用一个标志$inside来告诉您是否在所需的目标中:

代码语言:javascript
复制
perl -pe ' $inside = 1 if /<target name="-XXXX"/;
           print qq(              <antcall target="ZZZZ"/>\n) if $inside and m{</target>};
           $inside = 0 if m{</target>};
         ' 1.xml

或者,使用XML::LibXML包装器XML::XSH2

代码语言:javascript
复制
open 1.xml ;
insert chunk { qq(              <antcall target="ZZZZ"/>\n) } append //target[@name="-XXXX"] ;
save ;
票数 1
EN

Stack Overflow用户

发布于 2012-08-22 08:59:37

GNU sed

infile含量

代码语言:javascript
复制
<target name="-XXXX" unless="non_XXXX_buildpackage">
              <antcall target="init"/>
              ...............
              <antcall target="YYYY"/>
              <antcall target="ZZZZ"/>  **###The line should be inserted here**
</target>
<target name="-YYYY" unless="non_XXXX_buildpackage">
              <antcall target="init"/>
              ...............
              <antcall target="YYYY"/>
              <antcall target="ZZZZ"/>  **###The line should be inserted here**
</target>

script.sed含量

代码语言:javascript
复制
/^<target[ \t]\+name="-XXXX"/,/^<\/target>/ {
        /^<\/target>/ { i\
Your line                                                                                                                                                                                                                                   
        }
}

运行它就像:

代码语言:javascript
复制
sed -f script.sed infile

产出如下:

代码语言:javascript
复制
<target name="-XXXX" unless="non_XXXX_buildpackage">                                                                                                                                                                                         
              <antcall target="init"/>                                                                                                                                                                                                       
              ...............                                                                                                                                                                                                                
              <antcall target="YYYY"/>                                                                                                                                                                                                       
              <antcall target="ZZZZ"/>  **###The line should be inserted here**                                                                                                                                                              
Your line                                                                                                                                                                                                                                    
</target>                                                                                                                                                                                                                                    
<target name="-YYYY" unless="non_XXXX_buildpackage">                                                                                                                                                                                         
              <antcall target="init"/>                                                                                                                                                                                                       
              ...............                                                                                                                                                                                                                
              <antcall target="YYYY"/>                                                                                                                                                                                                       
              <antcall target="ZZZZ"/>  **###The line should be inserted here**                                                                                                                                                              
</target>
票数 1
EN

Stack Overflow用户

发布于 2012-08-22 09:01:09

这在sed实用程序中是可行的:

代码语言:javascript
复制
sed -i -e '/-XXXX/,/<\/target>/s/<\/target>/NEWLINEINSERTEDHERE\n<\/target>/' infile

我们告诉sed只考虑文件中正确的<target>...</target>部分,然后用添加的行和</target>替换</target>

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12069217

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档