Matt Clarkson
Matt Clarkson

Reputation: 14416

Set Ant property based on a regular expression in a file

I have the following in a file

version: [0,1,0]

and I would like to set an Ant property to the string value 0.1.0.

The regular expression is

version:[[:space:]]\[([[:digit:]]),([[:digit:]]),([[:digit:]])\]

and I need to then set the property to

\1.\2.\3

to get

0.1.0

I can't workout how to use the Ant tasks together to do this.

I have Ant-contrib so can use those tasks.

Upvotes: 4

Views: 11202

Answers (3)

comodoro
comodoro

Reputation: 1566

Based on matt's second solution, this worked for me for any (text) file, one line or not. It has no apache-contrib dependencies.

<loadfile property="version" srcfile="version.txt">
  <filterchain>
    <linecontainsregexp>
      <regexp pattern="version:[ \t]\[([0-9]),([0-9]),([0-9])\]"/>
    </linecontainsregexp>
    <replaceregex pattern="version:[ \t]\[([0-9]),([0-9]),([0-9])\]" replace="\1.\2.\3" />
  </filterchain>
</loadfile>  

Upvotes: 6

matt
matt

Reputation: 79723

Here's a way that doesn't use ant-contrib, using loadproperties and a filterchain (note that replaceregex is a "string filter" - see the tokenfilter docs - and not the replaceregexp task):

<loadproperties srcFile="version.txt">
  <filterchain>
    <replaceregex pattern="\[([0-9]),([0-9]),([0-9])\]" replace="\1.\2.\3" />
  </filterchain>
</loadproperties>

Note the regex is a bit different, we're treating the file as a property file.

Alternatively you could use loadfile with a filterchain, for instance if the file you wanted to load from wasn't in properties format.

For example, if the file contents were just [0,1,0] and you wanted to set the version property to 0.1.0, you could do something like:

<loadfile srcFile="version.txt" property="version">
  <filterchain>
    <replaceregex pattern="\s+\[([0-9]),([0-9]),([0-9])\]" replace="\1.\2.\3" />
  </filterchain>
</loadfile>

Upvotes: 5

Matt Clarkson
Matt Clarkson

Reputation: 14416

Solved it with this:

<loadfile property="burning-boots-js-lib-build.lib-version" srcfile="burning-boots.js"/>
<propertyregex property="burning-boots-js-lib-build.lib-version"
    override="true"
    input="${burning-boots-js-lib-build.lib-version}"
    regexp="version:[ \t]\[([0-9]),([0-9]),([0-9])\]"
    select="\1.\2.\3" />

But it seems a little wasteful - it loads the whole file into a property!

If anyone has any better suggestions please post :)

Upvotes: 4

Related Questions