Ant replaceregexp重写href链接到confluence链接

时间:2014-06-25 20:20:52

标签: regex ant

我需要将href链接转换为不同类型的链接(Confluence有自己的系统),而且我正在使用带有replaceregexp的Ant build.xml文件,但还没有完全接近。

基本上我需要从这样的链接开始:

<a class="xref" href="../Test_Topic_2/Test_Topic_2.txt">Test Topic 2</a>

然后把它们变成这个:

<ac:link><ri:page ri:content-title="Test_Topic_2" /></ac:link>

我有一个适用于上述链接的Ant build.xml文件,但如果路径以../../而不是../

开头,它就不起作用

由于获取主题名称的最佳位置来自'Test_Topic_2.txt'条目,我想知道是否有一种方法可以使用正则表达式从'.txt'向后工作,告诉它匹配来自的所有内容'.txt'回到它遇到的第一个斜线,将其留在原位,然后替换其余的。

可能有一些完全不同的方法,如果有任何想法请告诉我。

谢谢,

2 个答案:

答案 0 :(得分:0)

假设文件input.txt中的输入链接与构建文件位于同一路径上,并带有以下内容:

<a class="xref" href="../Test_Topic_1/Test_Topic_1.txt">Test Topic 1</a>
<a class="xref" href="../Test_Topic_2/Test_Topic_2.txt">Test Topic 2</a>
<a class="xref" href="../Test_Topic_3/Test_Topic_3.txt">Test Topic 3</a>
<a class="xref" href="../Test_Topic_4/Test_Topic_4.txt">Test Topic 4</a>

您可以将文件加载到属性中,然后遍历每一行并将其替换为更新的链接,将更新的链接保存在属性中并将其附加到输出文件,如下所示。

<loadfile property="file.content" srcFile="./input.txt" />

<for list="${file.content}" param="original.href" delimiter="${line.separator}">
    <sequential>
        <var name="updated.href" unset="true" />  
        <propertyregex input="@{original.href}" property="updated.href" regexp="&lt;a class=&quot;xref&quot; href=&quot;.+/([^/]+)\.txt&quot;&gt;.+&lt;/a&gt;"
              replace="&lt;ac:link&gt;&lt;ri:page ri:content-title=&quot;\1&quot; /&gt;&lt;/ac:link&gt;" />
        <echo message="${updated.href}${line.separator}" file="output.txt" append="true" />
    </sequential>
</for>

这种情况下的输出是:

<ac:link><ri:page ri:content-title="Test_Topic_1" /></ac:link>
<ac:link><ri:page ri:content-title="Test_Topic_2" /></ac:link>
<ac:link><ri:page ri:content-title="Test_Topic_3" /></ac:link>
<ac:link><ri:page ri:content-title="Test_Topic_4" /></ac:link>

答案 1 :(得分:0)

<replaceregexp byline="true">

   <regexp pattern="&lt;a class=.*?href=&quot;.*?([^\/]+)\.txt&quot;&gt;.*?&lt;\/a&gt;"/>
   <substitution expression="&lt;ac:link&gt;&lt;ri:page ri:content-title=&quot;\1&quot; \/&gt;&lt;\/ac:link&gt;"/>

   <fileset dir="${your.directory.containing.txt.files}">
      <include name="**/*.txt"/>
   </fileset>

</replaceregexp>  

此处,replaceregexp将处理输入文件的每一行,将其与<regex pattern="..."/>匹配,并将成功的匹配项替换为<substitution expression="..."/>
这将在 <{strong> <fileset>中的每个文件中完成。

所以,例如,如果您有以下目录。结构:

../ a / b / 1.txt, 2.txt  
../ a / b / c / 3.txt

然后将${your.directory.containing.txt.files}设置为../a/b/,然后按1.txt, 2.txt and 3.txt逐行处理文件<replaceregexp>将替换每个匹配的表达式

请参阅Demo here