<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	xmlns:georss="http://www.georss.org/georss" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:media="http://search.yahoo.com/mrss/"
	>

<channel>
	<title>Software Libero e non solo &#187; sostituire stringa</title>
	<atom:link href="http://kaosktrl.wordpress.com/tag/sostituire-stringa/feed/" rel="self" type="application/rss+xml" />
	<link>http://kaosktrl.wordpress.com</link>
	<description>Just another WordPress.com weblog</description>
	<lastBuildDate>Tue, 08 Dec 2009 09:17:31 +0000</lastBuildDate>
	<generator>http://wordpress.com/</generator>
	<language>it</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<cloud domain='kaosktrl.wordpress.com' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>http://www.gravatar.com/blavatar/e7bfd236201816f675e84cd6dd211349?s=96&#038;d=http://s.wordpress.com/i/buttonw-com.png</url>
		<title>Software Libero e non solo &#187; sostituire stringa</title>
		<link>http://kaosktrl.wordpress.com</link>
	</image>
	<atom:link rel="search" type="application/opensearchdescription+xml" href="http://kaosktrl.wordpress.com/osd.xml" title="Software Libero e non solo" />
		<item>
		<title>Ant e le espressioni regolari</title>
		<link>http://kaosktrl.wordpress.com/2008/06/27/ant-e-le-espressioni-regolari/</link>
		<comments>http://kaosktrl.wordpress.com/2008/06/27/ant-e-le-espressioni-regolari/#comments</comments>
		<pubDate>Fri, 27 Jun 2008 19:01:08 +0000</pubDate>
		<dc:creator>kaosktrl</dc:creator>
				<category><![CDATA[Software Libero]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[portabilità]]></category>
		<category><![CDATA[sviluppo]]></category>
		<category><![CDATA[ant]]></category>
		<category><![CDATA[espressioni regolari]]></category>
		<category><![CDATA[file xml]]></category>
		<category><![CDATA[regular expression]]></category>
		<category><![CDATA[sostituire stringa]]></category>

		<guid isPermaLink="false">http://kaosktrl.wordpress.com/?p=74</guid>
		<description><![CDATA[Mentre oggi ero intento a generare un po&#8217; di web services tramite axis2 il mio capo mi chiede di fare un lavoretto per conto di altre persone in azienda.
In pratica chiedono di modificare all&#8217;incirca 100.000 file di testo in formato XML, di 2kb, modificando il testo all&#8217;interno di un tag. La modifica è uguale per [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=kaosktrl.wordpress.com&blog=1930934&post=74&subd=kaosktrl&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>Mentre oggi ero intento a generare un po&#8217; di web services tramite axis2 il mio capo mi chiede di fare un lavoretto per conto di altre persone in azienda.</p>
<p>In pratica chiedono di modificare all&#8217;incirca 100.000 file di testo in formato XML, di 2kb, modificando il testo all&#8217;interno di un tag. La modifica è uguale per tutti: il testo da modificare in pratica contiene un path ad un file pdf e si  tratta aggiungere alla fine del path l&#8217;estensione &#8220;.pdf&#8221;.</p>
<p>Mi sono detto, siccome sto studiando Ant, perchè non farlo con questo ?</p>
<p>La cosa buona di Ant è che si puo&#8217; installare ovunque ci sia una java virtual machine, fino ad ora avevo usato i miei script bash ma il mio capo mi disse sarebbe bello poterli far girare su Windows cosi&#8217; ho preso a studiarmi Ant che non credo (fino ad ora) sia potente come la bash ma scopro di giorno in giorno le sue potenzialità. Qualcuno dirà che anche il perl e il python possono essere usati ma ho preferito questo.</p>
<p>In realtà Ant è una applicazione java e i suoi script sono file xml. I tag di questi file corrispondono a relative classi java permettendo quindi la loro estensione.</p>
<p>Ant può copiare e spostare file e directory, creare jar e war file per il deploy, calcolare l&#8217;md5 dei file, agire su variabili da usare come condizioni, collegarsi ad un CVS, creare test con Junit e tra le altre cose lavorare con le espressioni regolari.</p>
<p>Se vi serve una introduzione ad Ant, che vi collega al mio precedente <a href="http://kaosktrl.wordpress.com/2008/06/20/integrazione-continua-con-apache-continuum/" target="_blank">articolo sull&#8217;integrazione continua</a>, la redazione di Mokabyte ne scrisse una interessante:  <a href="http://www2.mokabyte.it/cms/article.run?articleId=U6E-KYB-TJQ-R9J_7f000001_30520983_cef94360" target="_blank">eccovela</a> !</p>
<p>Una volta installato (estratto) Ant ho configurato le variabili di ambiente <strong>ANT_HOME</strong> che punta alla cartella estratta e <strong>PATH</strong> che punta alla sottocartella bin.</p>
<p>Ho poi creato il file &#8220;<strong>build.xml</strong>&#8221; e l&#8217;ho messo insieme a file da modificare; il fatto di metterlo nella stessa cartella non è strettamente necessario perchè poi gli do la cartella di lavoro come parametro.</p>
<p>Ed eccovi il file:</p>
<pre>&lt;?xml version="1.0" encoding="UTF-8"?&gt;
&lt;project name="program" default="convert" basedir="."&gt;
&lt;property name="folder" value="." /&gt;
&lt;property name="backup_folder" value="backup" /&gt;
&lt;property name="file_extension" value="inf" /&gt;
&lt;property name="tag" value="PrintFileName" /&gt;
&lt;property name="extension" value="pdf" /&gt;

&lt;target name="backup" description="backup folder"&gt;
&lt;mkdir dir="${folder}/${backup_folder}" /&gt;
&lt;copy todir="${folder}/${backup_folder}" &gt;
&lt;fileset file="${folder}"/**.*${file_extension}" /&gt;
&lt;/copy&gt;
&lt;/target&gt;

&lt;target name="del_extension"&gt;
&lt;replaceregexp
  match="&lt;${tag}&gt;(.*).${extension}&lt;\/${tag}&gt;"
  replace="&lt;${tag}&gt;\1&lt;\/${tag}&gt;"&gt;
&lt;fileset dir="${folder}" includes="*.${file_extension}" /&gt;
&lt;/replaceregexp&gt;
&lt;/target&gt;

&lt;target name="add_extension"&gt;
&lt;replaceregexp
  match="&lt;${tag}&gt;[^(\.${extension})]&lt;\/${tag}&gt;"
  replace="&lt;${tag}&gt;\1.${extension}&lt;\/${tag}&gt;"&gt;
&lt;fileset dir="${folder}" includes="*.${file_extension}" /&gt;
&lt;/replaceregexp&gt;
&lt;/target&gt;

&lt;target name="convert" description="open files and add an extension to the text inside the selected tag"&gt;
&lt;antcall target="backup" /&gt;
&lt;antcall target="add_extension" /&gt;
&lt;/target&gt;

&lt;/project&gt;</pre>
<p>Intestazione XML a parte, nella seconda riga dichiaro che il target (funzione o metodo) da richiamare di default è <strong>convert</strong>. All&#8217;interno di questo target richiamo dapprima il target <strong>backup</strong> che realizza il backup della directory di lavoro e poi richiamo <strong>add_extension</strong> per modificare i file xml.</p>
<p>I parametri di default quali la cartella di lavoro (<strong>folder</strong>), la cartella di backup (<strong>backup_folder</strong>), l&#8217;estensione dei file che vado a modificare (<strong>file_extension</strong>), il tag xml che seleziono (<strong>tag</strong>) e l&#8217;estensione che aggiungo nel path (<strong>extension</strong>) sono definiti all&#8217;inizio del file e possono anche essere passati come parametro ad Ant.</p>
<p>Ad esempio se do:</p>
<pre>ant -Dfolder=./test</pre>
<p>Indico che la cartella dei file da modificare è la sottodirectory <strong>test</strong>, attenzione che se nel path ci sono degli spazi dovete usare le virgolette &#8221; &#8221; prima e dopo il path.</p>
<p>Il target backup crea quindi una cartella (<strong>mkdir</strong>) di backup dentro alla cartella di lavoro e copia in essa (<strong>copy</strong>) i file dalla cartella di lavoro con l&#8217;estensione che ho indicato (<strong>fileset</strong>). Se non volete fare il backup potete semplicemente rimuovere il suo richiamo nel target convert.</p>
<p>Andiamo alla parte delicata, come avete notato il target <strong>del_extension</strong> non viene richiamato, me lo sono lasciato per convienenza e vi permette di capire più facilmente il target <strong>add_extension</strong>.</p>
<p>Con il target del_extension si vuole selezionare tutti i path con il tag selezionato che già contengono la stringa &#8220;<strong>.pdf&#8221;</strong> e rimuoverla. Per fare ciò usiamo il task <strong>replaceregexp</strong> che ha 2 attributi: <strong>match</strong> e <strong>replace</strong>.</p>
<p>Con l&#8217;attributo match selezionamo il tag XML, di default <strong>PrintFileName</strong>, che contiene la stringa mentre con il tag replace sostituiamo la stringa trovata. I caratteri <strong>&lt;</strong> e <strong>&gt;</strong> mi servono per sostituire <strong>&lt;</strong> e <strong>&gt;</strong> in quanto non vengono accettati direttamente, poi vedete la variabile <strong>${tag}</strong> che viene aperta e chiusa (usando \/ in quanto il simbolo / è particolare) e all&#8217;interno l&#8217;espressione <strong>(.*)</strong> che indica tutti i caratteri con a seguire l&#8217;estensione <strong>.${extension}</strong>.</p>
<p>Quello che vogliamo fare è sostituire tutti i caratteri trovati nel mezzo togliendo l&#8217;estensione, il risultato della stringa trovata in match con i caratteri <strong>(.*)</strong> è indicata con <strong>\1</strong>.</p>
<p>Applico infine questa trasformazione all&#8217;insieme di file tramite il task <strong>fileset</strong>.</p>
<p>Il target add_extension dovrebbe funzionare al contrario se non che può capitare che alcuni path finiscano già per &#8220;<strong>.pdf</strong>&#8221; e quindi corriamo il rischio di aggiungerli nuovamente perciò nel mezzo è stato aggiunta l&#8217;espressione <strong>[^(\.${extension})]</strong> che indica di escludere tali path.</p>
<p>Semplice no ?</p>
<p>Ora non sono un esperto di espressioni regolari, me le sono giuste viste un pò, ma la cosa mi ha fatto apprezzare di più Ant.</p>
<img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/kaosktrl.wordpress.com/74/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/kaosktrl.wordpress.com/74/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/kaosktrl.wordpress.com/74/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/kaosktrl.wordpress.com/74/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/kaosktrl.wordpress.com/74/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/kaosktrl.wordpress.com/74/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/kaosktrl.wordpress.com/74/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/kaosktrl.wordpress.com/74/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/kaosktrl.wordpress.com/74/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/kaosktrl.wordpress.com/74/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/kaosktrl.wordpress.com/74/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/kaosktrl.wordpress.com/74/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=kaosktrl.wordpress.com&blog=1930934&post=74&subd=kaosktrl&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://kaosktrl.wordpress.com/2008/06/27/ant-e-le-espressioni-regolari/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/198117fcd7a30f63eba2e694b88a0b1d?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">kaosktrl</media:title>
		</media:content>
	</item>
	</channel>
</rss>