<?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/"
	>

<channel>
	<title>Calcifer &#187; bash</title>
	<atom:link href="http://blog.calcifer.com.ar/tag/bash/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.calcifer.com.ar</link>
	<description></description>
	<lastBuildDate>Sat, 02 Oct 2010 05:32:38 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Debian squeeze en Samsung N210</title>
		<link>http://blog.calcifer.com.ar/2010/07/debian-squeeze-en-samsung-n210/</link>
		<comments>http://blog.calcifer.com.ar/2010/07/debian-squeeze-en-samsung-n210/#comments</comments>
		<pubDate>Thu, 15 Jul 2010 18:07:03 +0000</pubDate>
		<dc:creator>lvidarte</dc:creator>
				<category><![CDATA[None]]></category>
		<category><![CDATA[bash]]></category>
		<category><![CDATA[gnome]]></category>
		<category><![CDATA[gnu/linux]]></category>

		<guid isPermaLink="false">http://blog.calcifer.com.ar/?p=731</guid>
		<description><![CDATA[La semana pasada me compré una netbook Samsung N210 con la cual estoy muy contento. Le instalé Debian squeeze (testing) y logré configurarle todas las teclas especiales, incluyendo las usadas para regular el brillo de la pantalla. Me basé en varias guías como esta y esta otra, aunque no las seguí exactamente y es por [...]]]></description>
			<content:encoded><![CDATA[<p>La semana pasada me compré una netbook <a href="http://www.samsung.com/sg/consumer/pc-peripherals-printer/notebook-pc/n-series/NP-N210-JA01SG/index.idx?pagetype=prd_detail" class="external">Samsung N210</a> con la cual estoy muy contento. Le instalé Debian squeeze (testing) y logré configurarle todas las teclas especiales, incluyendo las usadas para regular el brillo de la pantalla. Me basé en varias guías como <a href="http://artipc10.vub.ac.be/wordpress/uncategorized/samsung-n210-netbook-on-debian-gnulinux.html" title="Samsung N210 netbook on Debian GNU/Linux" class="external">esta</a> y <a href="http://josthalen.wordpress.com/2010/07/03/linux-on-samsung-n210/" title="Linux on Samsung N210" class="external">esta otra</a>, aunque no las seguí exactamente y es por eso el motivo del post.</p>
<p>Antes de comenzar la guía (y suponiendo que como yo, estás leyendo esto antes de comprar la máquina) te cuento mi experiencia con este aparatito. Algo que me hacía dudar en comprarme o no una netbook era el teclado que traían: demasiado chicos o sin espacio entre teclas. La N210 tiene casi la misma distancia entre la A y la Ñ que los teclados de escritorio y además tiene las teclas separadas como para que los dedos reconozcan mejor dónde están ubicados. Lo encuentro bastante cómodo y agradable de usar y salvo por un par de teclas que complican un poco (la &lt; se encuentra sobre la derecha y el shift derecho es chico) me siento a gusto con él. Por otro lado la batería dura aprox. 7 hs (con el brillo casi a tope) contra las 11 que declara Samsung. Dudo que llegue a eso incluso desconectando la wifi, bluetooth y poniendo el brillo al mínimo, pero aun así destaca su autonomía. Otra característica que me gusta es que es silenciosa y calienta muy poco.</p>
<p>Una última cosa antes de comenzar: El microprocesador <a href="http://ark.intel.com/Product.aspx?id=42503" class="external">Atom N450</a> tiene tecnología <a href="http://en.wikipedia.org/wiki/Hyper-threading" class="wikipedia">Hyperthreading</a> que paraleliza el procesador físico en dos procesadores virtuales. Es por eso que la salida de<code>/proc/cpuinfo</code>muestra dos cpus.</p>
<p>Ahora sí, vamos a la guía.</p>
<p><span id="more-731"></span></p>
<h3>Preparando el instalador</h3>
<p>El boot del instalador lo hice a través de la red, mediante un servidor <a href="http://en.wikipedia.org/wiki/Preboot_Execution_Environment" title="Preboot eXecution Environment" class="wikipedia">PXE</a> que armé en otra máquina. En realidad PXE no es un único servicio sino varios que en conjunto crean el entorno para que el boot remoto sea posible. Los servicios que lo componen son <a href="http://en.wikipedia.org/wiki/Dynamic_Host_Configuration_Protocol" title="Dynamic Host Configuration Protocol" class="wikipedia">DHCP</a>, <a href="http://en.wikipedia.org/wiki/Trivial_File_Transfer_Protocol" title="Trivial File Transfer Protocol" class="wikipedia">TFTP</a> e <a href="http://en.wikipedia.org/wiki/Inetd" title="InterNET Daemon" class="wikipedia">inetd</a> (o xinetd). Hay muchas guías por ahí para hacer esto: <a href="http://www.debian.org/releases/etch/i386/ch04s06.html.en" title="Preparing Files for TFTP Net Booting" class="external">1</a>, <a href="http://www.debian-administration.org/articles/478" title="Setting up a server for PXE network booting" class="external">2</a>, <a href="http://andys.org.uk/wiki/Guide:PXE_network_booting_Debian_install" title="PXE network booting Debian install" class="external">3</a>. Aquí va la receta que yo usé:</p>
<div class="codecolorer-container text " style="overflow:auto;white-space:nowrap;width:435px"><div class="text codecolorer" style="font-family:Monaco,Lucida Console,monospace"># apt-get install tftpd tftp dhcp3-server</div></div>
<p>En el archivo<code>/etc/dhcp3/dhcpd.conf</code>agregar lo siguiente:</p>
<div class="codecolorer-container text " style="overflow:auto;white-space:nowrap;width:435px"><div class="text codecolorer" style="font-family:Monaco,Lucida Console,monospace">group {<br />
&nbsp; allow bootp;<br />
&nbsp; next-server 192.168.1.2;<br />
&nbsp; &nbsp; filename &quot;pxelinux.0&quot;;<br />
&nbsp; &nbsp; host samsung-n210 {<br />
&nbsp; &nbsp; &nbsp; &nbsp; hardware ethernet 00:24:54:76:EC:08;<br />
&nbsp; &nbsp; &nbsp; &nbsp; fixed-address 192.168.1.10;<br />
&nbsp; &nbsp; }<br />
}</div></div>
<p>Donde<code>192.168.1.2</code>es la IP del servidor que tiene el servidor TFTP.<code>00:24:54:76:EC:08</code>es la MAC address de la netbook y<code>192.168.1.10</code>es la IP fija que se le asignará a la netbook.</p>
<p>El instalador de Debian agrega la siguiente línea a<code>/etc/inetd.conf</code>al momento de la instalación de tftpd así que ni hay que tocarlo:</p>
<div class="codecolorer-container text " style="overflow:auto;white-space:nowrap;width:435px"><div class="text codecolorer" style="font-family:Monaco,Lucida Console,monospace">tftp dgram udp wait nobody /usr/sbin/tcpd /usr/sbin/in.tftpd /srv/tftp/</div></div>
<p>Notar que el directorio<code>/srv/tftp/</code>es el raíz del servidor TFTP y es el lugar donde se debe descomprimir el <a href="http://d-i.debian.org/daily-images/amd64/daily/netboot/" title="" class="external">instalador de Debian</a>.</p>
<div class="codecolorer-container text " style="overflow:auto;white-space:nowrap;width:435px"><div class="text codecolorer" style="font-family:Monaco,Lucida Console,monospace"># tar xvf netboot.tar.gz -C /srv/tftp<br />
# chown -R nobody:nogroup /srv/tftp<br />
# chmod -R 777 /srv/tftp</div></div>
<p>El funcionamiento del servidor TFTP se puede comprobar ingresando y pidiendo un archivo:</p>
<div class="codecolorer-container text " style="overflow:auto;white-space:nowrap;width:435px"><div class="text codecolorer" style="font-family:Monaco,Lucida Console,monospace">$ tftp localhost<br />
tftp&gt; get version.info<br />
Received 65 bytes in 0.1 seconds</div></div>
<p>Finalmente hay que reinciar inetd, dhcp y setear la bios de la netbook para que haga el boot por la placa de red. Para no perder tiempo y poder ver cualquier error que se produzca es conveniente dejar sólo la placa de red en la secuencia de booteo.</p>
<h3>Instalación</h3>
<p>Bueno, no tengo mucho que decir acá. Yo preferí (por ansiedad) instalar el sistema base (pelado, sin X), instalar grub y finalizar; Reiniciar, cambiar la secuencia de boot y comprobar que Linux levantara correctamente.</p>
<p>Lo segundo entonces fue instalar<code>gnome-desktop-environment</code>y<code>firmware-linux-nonfree</code>y<code>network-manager-gnome</code>para la wifi.</p>
<p>El entorno gráfico levantó sin problemas y sin que tuviera que tocar nada. Out-of-the-box como le dicen.</p>
<h3>Ajuste de brillo y otras teclas rebeldes</h3>
<p>Antes de comprarme la máquina sabía que las teclas de ajuste de brillo no funcionaban pero ni bien instalé Gnome descubrí con sorpresa que sí andaban. Fue luego de un tiempo y de varios apt-get install que dejaron de funcionar. Además tampoco andaban las teclas activar/desactivar wifi, bluetooth y pantalla.</p>
<p>En la segunda guía que mencioné al principio del post cuentan que existe un proyecto llamado <a href="http://www.voria.org/forum/" title="" class="external">Linux on my Samsung</a> que lidera un tano copado llamado Fortunato Ventre y que escribió<code>samsung-tools</code>(en Python) y que sirve para darle vida a esas teclas que tanto nos angustian cuano no hacen lo que dicen hacer. El programa usa un módulo, escrito por otra gente, llamado<code>samsung_backlight</code>que se distribuye bajo el paquete <a href="http://code.google.com/p/easy-slow-down-manager/" title="" class="external">easy-slow-down-manager</a> y que según palabras de sus creadores hace lo siguiente:</p>
<blockquote><p>Easy slow down manager provides Linux users with functionality similar to &#8220;Samsung Easy Speed Up Manager&#8221;. It also allows to turn WiFi on and off.
</p></blockquote>
<p>Entonces hay que instalar primero este módulo, para lo cual necesitamos descargar el <a href="http://code.google.com/p/easy-slow-down-manager/downloads/list" title="" class="external">.deb</a> y compilarlo con los headers correspondientes al kernel que estemos usando.</p>
<div class="codecolorer-container text " style="overflow:auto;white-space:nowrap;width:435px"><div class="text codecolorer" style="font-family:Monaco,Lucida Console,monospace"># apt-get install linux-headers-`uname -r`<br />
# dpkg -i easy-slow-down-manager-dkms_0.13.1_all.deb</div></div>
<p>Luego de instalar el módulo, bajamos el paquete <a href="https://launchpad.net/samsung-tools" title="" class="external">samsung-tools</a> y lo compilamos también, no sin antes instalar sus dependencias.</p>
<div class="codecolorer-container text " style="overflow:auto;white-space:nowrap;width:435px"><div class="text codecolorer" style="font-family:Monaco,Lucida Console,monospace"># apt-get install xbindkeys dbus-python rfkill gettext<br />
# tar xzf samsung-tools-1.1.1.tar.gz<br />
# cd &nbsp;samsung-tools-1.1.1<br />
# make<br />
# make install</div></div>
<p>Las teclas de brillo deberían funcionar tras reiniciar el sistema. Si no, puede que no esté cargado el módulo. Acá dejo la salida de algunos comandos de mi sistema funcionando:</p>
<div class="codecolorer-container text " style="overflow:auto;white-space:nowrap;width:435px"><div class="text codecolorer" style="font-family:Monaco,Lucida Console,monospace"># modprobe -l | grep -i samsung-backlight<br />
updates/samsung-backlight/samsung-backlight.ko<br />
# lsmod | grep samsung<br />
samsung_backlight &nbsp; &nbsp; &nbsp; 2740 &nbsp;0<br />
# dmesg | grep Samsung<br />
[ &nbsp; &nbsp;4.009833] Samsung-backlight: checking for SABI support.<br />
[ &nbsp; &nbsp;4.010082] Samsung-backlight: SABI is supported (f5191)</div></div>
<h3>El TouchPad</h3>
<p>Sólo nos resta ocuparnos de este, que de movida funciona pero tiene algunas opciones ocultas que pueden ser interesantes, como el scolling circular. El TouchPad puede setearse directamente desde la consola mediante el comando<code>synclient</code>pasándole como parámetro la propiedad a modificar y su nuevo valor. Las siguientes dos líneas habilitan el scrolling horizontal:</p>
<div class="codecolorer-container text " style="overflow:auto;white-space:nowrap;width:435px"><div class="text codecolorer" style="font-family:Monaco,Lucida Console,monospace">$ synclient HorizEdgeScroll=1<br />
$ synclient TouchpadOff=0</div></div>
<p>Se puede obtener un listado completo de todas las propiedades con sus valores actuales ejecutando</p>
<div class="codecolorer-container text " style="overflow:auto;white-space:nowrap;width:435px"><div class="text codecolorer" style="font-family:Monaco,Lucida Console,monospace">$ synclient -l</div></div>
<p>Lindo, pero es un poco engorroso manejarlo así (y yo quiero habilitar y setear el scrolling circular). Por suerte existe <a href="http://live.gnome.org/GPointingDeviceSettings" title="" class="external">gpointing-device-settings</a> que permite configurar el TouchPad en forma gráfica.</p>
<p><img src="http://blog.calcifer.com.ar/uploads/2010/07/GPointingDeviceSettings.png" alt="" title="GPointingDeviceSettings" width="420" height="345" class="noborder" /></p>
<p>Lamentablemente la versión actual (1.5.1-2) tiene un <a href="https://bugs.launchpad.net/ubuntu/+source/gpointing-device-settings/+bug/489830" title="Settings of gpointing-device-settings are non-persistent" class="external">bug conocido</a> que no persiste los cambios al salir de la sesión. Seguramente lo arreglarán pronto. Mientras tanto se me ocurrió lo siguiente: setear todas las propiedades con gpointing-device-settings, recolectar el estado completo con synclient -l y generar un .sh que se ejecute al inicio de la sesión:</p>
<div class="codecolorer-container text " style="overflow:auto;white-space:nowrap;width:435px"><div class="text codecolorer" style="font-family:Monaco,Lucida Console,monospace">$ synclient -l | awk '{if(NR==1)print &quot;#!/bin/bash&quot;;else print &quot;synclient &quot; $1 $2 $3}' &gt; touchpad-settings.sh &amp;&amp; chmod u+x touchpad-settings.sh</div></div>
<p>Sólo queda añadir<code>touchpad-settings.sh</code>al listado de aplicaciones que se ejecutan al iniciar la sesión de Gnome.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.calcifer.com.ar/2010/07/debian-squeeze-en-samsung-n210/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>GNU gettext con php5</title>
		<link>http://blog.calcifer.com.ar/2009/03/gnu-gettext-con-php5/</link>
		<comments>http://blog.calcifer.com.ar/2009/03/gnu-gettext-con-php5/#comments</comments>
		<pubDate>Sat, 21 Mar 2009 17:55:06 +0000</pubDate>
		<dc:creator>lvidarte</dc:creator>
				<category><![CDATA[None]]></category>
		<category><![CDATA[bash]]></category>
		<category><![CDATA[code]]></category>
		<category><![CDATA[gnu/linux]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://blog.calcifer.com.ar/?p=226</guid>
		<description><![CDATA[
GNU gettext es la biblioteca GNU de internacionalización (i18n) y es usada para escribir programas con interfaz en múltiples idiomas.
wikipedia
La internacionalización es el proceso de diseñar software de manera tal que pueda adaptarse a diferentes idiomas y regiones sin necesidad de cambios de ingeniería ni de código. La localización es el proceso de adaptar el [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://blog.calcifer.com.ar/uploads/2009/03/gnu-head-sm.jpg" alt="gnu-head-sm" title="gnu-head-sm" width="129" height="122" class="alignright size-full wp-image-231" /></p>
<p><a href="http://www.gnu.org/software/gettext/gettext.html" class="wikipedia">GNU gettext</a> es la biblioteca <a href="http://es.wikipedia.org/wiki/GNU" class="wikipedia">GNU</a> de <a href="http://es.wikipedia.org/wiki/Internacionalizaci%C3%B3n_(computaci%C3%B3n)" class="wikipedia">internacionalización</a> (i18n) y es usada para escribir programas con interfaz en múltiples idiomas.</p>
<p><a href="http://es.wikipedia.org/wiki/Internacionalizaci%C3%B3n_(computaci%C3%B3n)" class="wikipedia">wikipedia</a></p>
<blockquote title="wikipedia.org"><p>La internacionalización es el proceso de diseñar software de manera tal que pueda adaptarse a diferentes idiomas y regiones sin necesidad de cambios de ingeniería ni de código. La localización es el proceso de adaptar el software para una región específica mediante la adición de componentes específicos de un locale y la traducción de los textos, por lo que también se le puede denominar regionalización.<br />
&#8230;<br />
Es una práctica común en el idioma inglés (sobre todo en el ámbito de la computación), abreviar internationalization como &#8220;i18n&#8221;. Ello se debe a que entre la primera i y la última n de dicha palabra hay 18 letras. Lo mismo sucede con localization, que se abrevia &#8220;L10n&#8221;.
</p></blockquote>
<h3>gettext en PHP</h3>
<p>Existen dos formas de usar gettext en PHP: mediante la <a href="http://ar2.php.net/manual/en/book.gettext.php" class="external">extensión gettext nativa de PHP</a> o utilizando la librería <a href="http://savannah.nongnu.org/projects/php-gettext/" class="external">PHP-gettext</a>, escrita en PHP, que no necesita ninguna extensión.</p>
<p>La forma de usar gettext es</p>
<div class="codecolorer-container php " style="overflow:auto;white-space:nowrap;width:435px"><table cellspacing="0" cellpadding="0"><tbody><tr><td class="line-numbers"><div>1<br />2<br />3<br />4<br /></div></td><td><div class="php codecolorer" style="font-family:Monaco,Lucida Console,monospace"># @file: index.php<br />
<span class="kw2">&lt;?php</span><br />
<a href="http://www.php.net/print"><span class="kw3">print</span></a> <a href="http://www.php.net/_"><span class="kw3">_</span></a><span class="br0">&#40;</span><span class="st0">&quot;hello world&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<span class="sy1">?&gt;</span></div></td></tr></tbody></table></div>
<p>La función<code>_()</code>, alias de<code>gettext()</code>, devolverá la cadena &#8220;hello world&#8221; en el lenguaje correspondiente, de acuerdo al <a href="http://en.wikipedia.org/wiki/Locale" class="wikipedia">locale</a> que hayamos seleccionado.</p>
<p>Si ejecutamos el script obtendremos &#8220;hello world&#8221; como salida, puesto que no hemos indicado ningún locale, ni creado ningún catálogo de traducción. Necesitamos crear el archivo<code>comments.po</code>con la traducción de la cadena &#8220;hello world&#8221;. Esto puede hacerse mediante el comando<code>xgettext</code>, o mediante un editor gráfico como <a href="http://www.poedit.net/" class="external">poEdit</a>.</p>
<div class="codecolorer-container bash " style="overflow:auto;white-space:nowrap;width:435px"><div class="bash codecolorer" style="font-family:Monaco,Lucida Console,monospace"><span class="kw2">apt-get</span> <span class="kw2">install</span> poedit</div></div>
<h3>Creación del catálogo con poEdit</h3>
<p>Ante todo debemos saber que la estructura de directorios para guardar los distintos catálogos tiene forma determinada. Por cada traducción se utiliza un directorio. Este generalmente se nombra usando dos letras minúsculas para el idioma, un guión bajo y dos mayúsculas para el país (es_AR, para español de Argentina). Dentro de este directorio debe existir otro con el nombre LC_MESSAGES, el cual será finalmente el directorio que contendrá el catálogo.</p>
<p>La estructura de nuestro ejemplo será</p>
<div class="codecolorer-container bash " style="overflow:auto;white-space:nowrap;width:435px"><div class="bash codecolorer" style="font-family:Monaco,Lucida Console,monospace">.<br />
<span class="sy0">|</span>-- locale<br />
<span class="sy0">|</span> &nbsp; <span class="sy0">`</span>-- es_AR<br />
<span class="sy0">|</span> &nbsp; &nbsp; &nbsp; <span class="sy0">`</span>-- LC_MESSAGES<br />
<span class="sy0">|</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sy0">|</span>-- messages.mo<br />
<span class="sy0">|</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sy0">`</span>-- messages.po<br />
<span class="sy0">`</span>-- index.php</div></div>
<p>El archivo<code>messages.mo</code>es la versión compilada de<code>messages.po</code>y el que usará PHP para obtener la traducción.</p>
<p>Iniciemos poEdit. La primera vez nos preguntará por nuestro nombre y correo electrónico. Estos datos servirán para saber quién fue el último traductor que modificó el catálogo. Una vez en la ventana principal vamos a File -> New catalog. Seleccionamos el idioma (Español en este caso), el país y el código de caracteres tanto para el catálogo como para la fuente de datos desde la que obtendremos el listado de cadenas que requieren traducción. En la solapa Paths debemos colocar en &#8216;Base path&#8217; la ruta completa al directorio base de archivos php (conteniendo las cadenas mencionadas anteriormente) y, debajo, en el cuadro &#8216;Paths&#8217; agregar una entrada con &#8216;.&#8217; indicando que se debe utilizar el directorio ingresado anteriormente. Al hacer click en OK aparecerá un cuadro de diálogo para guardar el nuevo catálogo. Navegamos hasta el directorio LC_MESSAGES y guardamos el archivo como messages.po. poEdit escaneará el directorio ingresado en Paths y extraerá todos las cadenas gettext. Ahora queda simplemente realizar la traducción y guardar el archivo. Al guardarlo, poEdit lo compilará y generará el .mo que finalmente usará PHP.</p>
<p>Ahora, modificaremos index.php para setear el locale</p>
<div class="codecolorer-container php " style="overflow:auto;white-space:nowrap;width:435px"><table cellspacing="0" cellpadding="0"><tbody><tr><td class="line-numbers"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br /></div></td><td><div class="php codecolorer" style="font-family:Monaco,Lucida Console,monospace"># @file: index.php<br />
<span class="kw2">&lt;?php</span><br />
<span class="re0">$language</span> <span class="sy0">=</span> <span class="st_h">'es_AR.UTF-8'</span><span class="sy0">;</span><br />
<a href="http://www.php.net/putenv"><span class="kw3">putenv</span></a><span class="br0">&#40;</span><span class="st0">&quot;LANG=<span class="es4">$language</span>&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span> <br />
<a href="http://www.php.net/setlocale"><span class="kw3">setlocale</span></a><span class="br0">&#40;</span>LC_ALL<span class="sy0">,</span> <span class="st0">&quot;&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<br />
<span class="re0">$domain</span> <span class="sy0">=</span> <span class="st0">&quot;messages&quot;</span><span class="sy0">;</span><br />
<a href="http://www.php.net/bindtextdomain"><span class="kw3">bindtextdomain</span></a><span class="br0">&#40;</span><span class="re0">$domain</span><span class="sy0">,</span> <span class="st0">&quot;./locale&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<a href="http://www.php.net/bind_textdomain_codeset"><span class="kw3">bind_textdomain_codeset</span></a><span class="br0">&#40;</span><span class="re0">$domain</span><span class="sy0">,</span> <span class="st_h">'UTF-8'</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<a href="http://www.php.net/textdomain"><span class="kw3">textdomain</span></a><span class="br0">&#40;</span><span class="re0">$domain</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<br />
<a href="http://www.php.net/print"><span class="kw3">print</span></a> <a href="http://www.php.net/_"><span class="kw3">_</span></a><span class="br0">&#40;</span><span class="st0">&quot;hello world&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<span class="sy1">?&gt;</span></div></td></tr></tbody></table></div>
<p>Aun nos queda un paso y es comprobar que tengamos dicho locale habilitado en nuestro sistema. Esto lo hacemos mirando la salida de</p>
<div class="codecolorer-container bash " style="overflow:auto;white-space:nowrap;width:435px"><div class="bash codecolorer" style="font-family:Monaco,Lucida Console,monospace">locale <span class="re5">-a</span></div></div>
<p>Si no tenemos habilitado el charset es_AR.UTF8, ejecutamos</p>
<div class="codecolorer-container bash " style="overflow:auto;white-space:nowrap;width:435px"><div class="bash codecolorer" style="font-family:Monaco,Lucida Console,monospace">locale-gen es_AR.UTF-<span class="nu0">8</span></div></div>
<p>En este punto la salida del script debería ser la traducción que hicimos al español.</p>
<h3>Tip</h3>
<p>Para casos en que la cadena a traducir contenga variables, podemos utilizar esta función:</p>
<div class="codecolorer-container php " style="overflow:auto;white-space:nowrap;width:435px"><table cellspacing="0" cellpadding="0"><tbody><tr><td class="line-numbers"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br /></div></td><td><div class="php codecolorer" style="font-family:Monaco,Lucida Console,monospace"><span class="kw2">function</span> __<span class="br0">&#40;</span><span class="re0">$string</span><span class="br0">&#41;</span><br />
<span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="re0">$arg</span> <span class="sy0">=</span> <a href="http://www.php.net/array"><span class="kw3">array</span></a><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw1">for</span><span class="br0">&#40;</span><span class="re0">$i</span> <span class="sy0">=</span> <span class="nu0">1</span> <span class="sy0">;</span> <span class="re0">$i</span> <span class="sy0">&lt;</span> <a href="http://www.php.net/func_num_args"><span class="kw3">func_num_args</span></a><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span> <span class="re0">$i</span><span class="sy0">++</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$arg</span><span class="br0">&#91;</span><span class="br0">&#93;</span> <span class="sy0">=</span> <a href="http://www.php.net/func_get_arg"><span class="kw3">func_get_arg</span></a><span class="br0">&#40;</span><span class="re0">$i</span><span class="br0">&#41;</span><span class="sy0">;</span> <br />
&nbsp; &nbsp; <span class="kw1">return</span> <a href="http://www.php.net/vsprintf"><span class="kw3">vsprintf</span></a><span class="br0">&#40;</span><a href="http://www.php.net/gettext"><span class="kw3">gettext</span></a><span class="br0">&#40;</span><span class="re0">$string</span><span class="br0">&#41;</span><span class="sy0">,</span> <span class="re0">$arg</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<span class="br0">&#125;</span><br />
<br />
<span class="re0">$total</span> <span class="sy0">=</span> <span class="nu0">400</span><span class="sy0">;</span><br />
<a href="http://www.php.net/print"><span class="kw3">print</span></a> __<span class="br0">&#40;</span><span class="st0">&quot;results <span class="es6">%d</span> - <span class="es6">%d</span> of about <span class="es6">%d</span>&quot;</span><span class="sy0">,</span> <span class="nu0">1</span><span class="sy0">,</span> <span class="nu0">20</span><span class="sy0">,</span> <span class="re0">$total</span><span class="br0">&#41;</span><span class="sy0">;</span></div></td></tr></tbody></table></div>
<p>La traducción podría quedar</p>
<div class="codecolorer-container text " style="overflow:auto;white-space:nowrap;width:435px"><div class="text codecolorer" style="font-family:Monaco,Lucida Console,monospace">resultados %d - %d de aproximadamente %d</div></div>
]]></content:encoded>
			<wfw:commentRss>http://blog.calcifer.com.ar/2009/03/gnu-gettext-con-php5/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Crear un parche</title>
		<link>http://blog.calcifer.com.ar/2008/11/crear-un-parche/</link>
		<comments>http://blog.calcifer.com.ar/2008/11/crear-un-parche/#comments</comments>
		<pubDate>Tue, 04 Nov 2008 16:21:22 +0000</pubDate>
		<dc:creator>lvidarte</dc:creator>
				<category><![CDATA[None]]></category>
		<category><![CDATA[bash]]></category>

		<guid isPermaLink="false">http://blog.calcifer.com.ar/?p=170</guid>
		<description><![CDATA[Suponiendo el archivo
xleo@okkoto:/tmp$ cat file1
uno
2
tres
cuatro
seis
y su modificación
xleo@okkoto:/tmp$ cat file2
uno
dos
tres
cuatro
cinco
seis
creamos el archivo conteniendo las diferencias
xleo@okkoto:/tmp$ diff -u file1 file2 &#62; file.patch
y finalmente aplicamos el parche
xleo@okkoto:/tmp$ patch &#60; file.patch
patching file file1
]]></description>
			<content:encoded><![CDATA[<p>Suponiendo el archivo</p>
<div class="codecolorer-container bash blackboard" style="overflow:auto;white-space:nowrap;width:435px"><div class="bash codecolorer" style="font-family:Monaco,Lucida Console,monospace">xleo<span class="sy0">@</span>okkoto:<span class="sy0">/</span>tmp$ <span class="kw2">cat</span> file1<br />
uno<br />
<span class="nu0">2</span><br />
tres<br />
cuatro<br />
seis</div></div>
<p>y su modificación</p>
<div class="codecolorer-container bash blackboard" style="overflow:auto;white-space:nowrap;width:435px"><div class="bash codecolorer" style="font-family:Monaco,Lucida Console,monospace">xleo<span class="sy0">@</span>okkoto:<span class="sy0">/</span>tmp$ <span class="kw2">cat</span> file2<br />
uno<br />
dos<br />
tres<br />
cuatro<br />
cinco<br />
seis</div></div>
<p>creamos el archivo conteniendo las diferencias</p>
<div class="codecolorer-container bash blackboard" style="overflow:auto;white-space:nowrap;width:435px"><div class="bash codecolorer" style="font-family:Monaco,Lucida Console,monospace">xleo<span class="sy0">@</span>okkoto:<span class="sy0">/</span>tmp$ <span class="kw2">diff</span> <span class="re5">-u</span> file1 file2 <span class="sy0">&gt;</span> file.patch</div></div>
<p>y finalmente aplicamos el parche</p>
<div class="codecolorer-container bash blackboard" style="overflow:auto;white-space:nowrap;width:435px"><div class="bash codecolorer" style="font-family:Monaco,Lucida Console,monospace">xleo<span class="sy0">@</span>okkoto:<span class="sy0">/</span>tmp$ <span class="kw2">patch</span> <span class="sy0">&lt;</span> file.patch<br />
patching <span class="kw2">file</span> file1</div></div>
]]></content:encoded>
			<wfw:commentRss>http://blog.calcifer.com.ar/2008/11/crear-un-parche/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Generar rango numérico en Bash</title>
		<link>http://blog.calcifer.com.ar/2008/07/generar-rango-numerico-en-bash/</link>
		<comments>http://blog.calcifer.com.ar/2008/07/generar-rango-numerico-en-bash/#comments</comments>
		<pubDate>Tue, 08 Jul 2008 04:44:55 +0000</pubDate>
		<dc:creator>lvidarte</dc:creator>
				<category><![CDATA[None]]></category>
		<category><![CDATA[bash]]></category>

		<guid isPermaLink="false">http://blog.calcifer.com.ar/2008/07/08/generar-rango-numerico-en-bash/</guid>
		<description><![CDATA[Usando seq
Syntax:
seq LAST
seq FIRST LAST
seq FIRST INCREMENT LAST
Code:
$ seq 5 10
$ seq 0 2 10
$ seq 5 -1 1
Script:
#!/bin/bash
for i in `seq 5`
do
&#160; &#160;echo &#34;Welcome $i times&#34;
done
Usando for
#!/bin/bash
for &#40;&#40;a=1; a&#60;=5; a++&#41;&#41;
do
&#160; &#160;echo &#34;Welcome $i times&#34;
done
]]></description>
			<content:encoded><![CDATA[<h4>Usando seq</h4>
<p>Syntax:</p>
<div class="codecolorer-container bash blackboard" style="overflow:auto;white-space:nowrap;width:435px"><div class="bash codecolorer" style="font-family:Monaco,Lucida Console,monospace"><span class="kw2">seq</span> LAST<br />
<span class="kw2">seq</span> FIRST LAST<br />
<span class="kw2">seq</span> FIRST INCREMENT LAST</div></div>
<p>Code:</p>
<div class="codecolorer-container bash blackboard" style="overflow:auto;white-space:nowrap;width:435px"><div class="bash codecolorer" style="font-family:Monaco,Lucida Console,monospace">$ <span class="kw2">seq</span> <span class="nu0">5</span> <span class="nu0">10</span><br />
$ <span class="kw2">seq</span> <span class="nu0">0</span> <span class="nu0">2</span> <span class="nu0">10</span><br />
$ <span class="kw2">seq</span> <span class="nu0">5</span> <span class="re5">-1</span> <span class="nu0">1</span></div></div>
<p>Script:</p>
<div class="codecolorer-container bash blackboard" style="overflow:auto;white-space:nowrap;width:435px"><div class="bash codecolorer" style="font-family:Monaco,Lucida Console,monospace"><span class="co0">#!/bin/bash</span><br />
<span class="kw1">for</span> i <span class="kw1">in</span> <span class="sy0">`</span><span class="kw2">seq</span> <span class="nu0">5</span><span class="sy0">`</span><br />
<span class="kw1">do</span><br />
&nbsp; &nbsp;<span class="kw3">echo</span> <span class="st0">&quot;Welcome <span class="es2">$i</span> times&quot;</span><br />
<span class="kw1">done</span></div></div>
<h4>Usando for</h4>
<div class="codecolorer-container bash blackboard" style="overflow:auto;white-space:nowrap;width:435px"><div class="bash codecolorer" style="font-family:Monaco,Lucida Console,monospace"><span class="co0">#!/bin/bash</span><br />
<span class="kw1">for</span> <span class="br0">&#40;</span><span class="br0">&#40;</span><span class="re2">a</span>=<span class="nu0">1</span>; a<span class="sy0">&lt;</span>=<span class="nu0">5</span>; a++<span class="br0">&#41;</span><span class="br0">&#41;</span><br />
<span class="kw1">do</span><br />
&nbsp; &nbsp;<span class="kw3">echo</span> <span class="st0">&quot;Welcome <span class="es2">$i</span> times&quot;</span><br />
<span class="kw1">done</span></div></div>
]]></content:encoded>
			<wfw:commentRss>http://blog.calcifer.com.ar/2008/07/generar-rango-numerico-en-bash/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Renombrar recursivamente archivos y directorios</title>
		<link>http://blog.calcifer.com.ar/2008/06/renombrar-recursivamente-archivos-y-directorios/</link>
		<comments>http://blog.calcifer.com.ar/2008/06/renombrar-recursivamente-archivos-y-directorios/#comments</comments>
		<pubDate>Tue, 10 Jun 2008 03:50:58 +0000</pubDate>
		<dc:creator>lvidarte</dc:creator>
				<category><![CDATA[None]]></category>
		<category><![CDATA[bash]]></category>
		<category><![CDATA[gnu/linux]]></category>
		<category><![CDATA[recursivity]]></category>
		<category><![CDATA[regex]]></category>

		<guid isPermaLink="false">http://blog.calcifer.com.ar/2008/06/10/renombrar-recursivamente-archivos-y-directorios/</guid>
		<description><![CDATA[El siguiente script de bash renombra archivos y directorios convirtiendo sus nombres a minúsculas, reemplazando espacios, acentos, eñes y eliminando paréntesis.
Por defecto renombra únicamente aquellos archivos y directorios ubicados en el directorio pasado como parámetro. Es posible usar la opción-r&#124;--recursivepara que trabaje recursivamente en todos los directorios hijos:
./rename.sh -r dir
Usando la opción-v&#124;--verbosees posible ver en [...]]]></description>
			<content:encoded><![CDATA[<p>El siguiente script de bash renombra archivos y directorios convirtiendo sus nombres a minúsculas, reemplazando espacios, acentos, eñes y eliminando paréntesis.</p>
<p>Por defecto renombra únicamente aquellos archivos y directorios ubicados en el directorio pasado como parámetro. Es posible usar la opción<code>-r|--recursive</code>para que trabaje recursivamente en todos los directorios hijos:</p>
<div class="codecolorer-container text " style="overflow:auto;white-space:nowrap;width:435px"><div class="text codecolorer" style="font-family:Monaco,Lucida Console,monospace">./rename.sh -r dir</div></div>
<p>Usando la opción<code>-v|--verbose</code>es posible ver en pantalla el listado de archivos modificados</p>
<div class="codecolorer-container text " style="overflow:auto;white-space:nowrap;width:435px"><div class="text codecolorer" style="font-family:Monaco,Lucida Console,monospace">./rename.sh -v -r dir</div></div>
<p>La opción<code>-t|--test</code>muestra un listado de cambios a realizar sin realizar ninguno</p>
<div class="codecolorer-container text " style="overflow:auto;white-space:nowrap;width:435px"><div class="text codecolorer" style="font-family:Monaco,Lucida Console,monospace">./rename.sh -t -r dir</div></div>
<h3>Ejemplo</h3>
<div class="codecolorer-container text " style="overflow:auto;white-space:nowrap;width:435px;height:300px"><div class="text codecolorer" style="font-family:Monaco,Lucida Console,monospace">xleo@calcifer:/tmp/music$ rename -t -r .<br />
/tmp/music/Jaime Roos/1998 - Concierto Aniversario<br />
./17 - Amándote.mp3 ./17_-_amandote.mp3<br />
./02 - Victoria Abaracón.mp3 ./02_-_victoria_abaracon.mp3<br />
./12 - Nadie Me Dijo Nada.mp3 ./12_-_nadie_me_dijo_nada.mp3<br />
./16 - Durazno Y Convención.mp3 ./16_-_durazno_y_convencion.mp3<br />
./01 - Si Me Voy Antes Que Vos-1.mp3 ./01_-_si_me_voy_antes_que_vos-1.mp3<br />
./03 - El Hombre De La Calle.mp3 ./03_-_el_hombre_de_la_calle.mp3<br />
./05 - Las Luces Del Estadio.mp3 ./05_-_las_luces_del_estadio.mp3<br />
./07 - Piropo.mp3 ./07_-_piropo.mp3<br />
./10 - Esta Noche.mp3 ./10_-_esta_noche.mp3<br />
./06 - Se Va La Murga.mp3 ./06_-_se_va_la_murga.mp3<br />
./08 - Los Futuros Murguistas.mp3 ./08_-_los_futuros_murguistas.mp3<br />
./15 - Tal Vez Cheché.mp3 ./15_-_tal_vez_cheche.mp3<br />
./13 - Bienvenido.mp3 ./13_-_bienvenido.mp3<br />
./1998 - Concierto Aniversario.m3u ./1998_-_concierto_aniversario.m3u<br />
./09 - Los Olímpicos.mp3 ./09_-_los_olimpicos.mp3<br />
./11 - Cometa De La Farola.mp3 ./11_-_cometa_de_la_farola.mp3<br />
./04 - Cuando Juega Uruguay.mp3 ./04_-_cuando_juega_uruguay.mp3<br />
./14 - El Tambor.mp3 ./14_-_el_tambor.mp3<br />
/tmp/music/Jaime Roos<br />
./1998 - Concierto Aniversario ./1998_-_concierto_aniversario<br />
/tmp/music<br />
./Jaime Roos ./jaime_roos</div></div>
<h3>rename.sh</h3>
<div class="codecolorer-container bash " style="overflow:auto;white-space:nowrap;width:435px;height:500px"><table cellspacing="0" cellpadding="0"><tbody><tr><td class="line-numbers"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br />24<br />25<br />26<br />27<br />28<br />29<br />30<br />31<br />32<br />33<br />34<br />35<br />36<br />37<br />38<br />39<br />40<br />41<br />42<br />43<br />44<br />45<br />46<br />47<br />48<br />49<br />50<br />51<br />52<br />53<br />54<br />55<br />56<br />57<br />58<br />59<br />60<br />61<br />62<br />63<br />64<br />65<br />66<br />67<br />68<br />69<br />70<br />71<br />72<br />73<br />74<br />75<br />76<br />77<br />78<br />79<br />80<br />81<br />82<br />83<br />84<br />85<br />86<br />87<br />88<br />89<br />90<br />91<br />92<br />93<br />94<br />95<br />96<br />97<br />98<br />99<br />100<br />101<br />102<br />103<br />104<br />105<br />106<br />107<br />108<br />109<br />110<br />111<br />112<br />113<br />114<br />115<br />116<br />117<br />118<br />119<br />120<br />121<br />122<br />123<br />124<br />125<br />126<br />127<br />128<br />129<br />130<br />131<br />132<br />133<br />134<br />135<br />136<br />137<br />138<br />139<br />140<br />141<br />142<br />143<br />144<br />145<br />146<br />147<br />148<br />149<br />150<br />151<br />152<br />153<br />154<br />155<br />156<br />157<br />158<br />159<br /></div></td><td><div class="bash codecolorer" style="font-family:Monaco,Lucida Console,monospace"><span class="co0">#!/bin/bash</span><br />
<span class="co0">#</span><br />
<span class="co0"># @autor &nbsp; Leonardo Vidarte</span><br />
<span class="co0"># @version $Id rename.sh 5 2008-06-05 15:44:45Z xleo $</span><br />
<span class="co0">#</span><br />
<br />
<br />
<span class="co0"># ********</span><br />
<span class="co0"># INIT SET</span><br />
<span class="co0"># ********</span><br />
<span class="re2">verbose</span>=<span class="nu0">0</span><br />
<span class="re2">recursive</span>=<span class="nu0">0</span><br />
<span class="re2">MOVE</span>=<span class="sy0">/</span>bin<span class="sy0">/</span><span class="kw2">mv</span><br />
<span class="re2">ECHO</span>=<br />
<br />
<br />
<span class="co0"># ****</span><br />
<span class="co0"># HELP</span><br />
<span class="co0"># ****</span><br />
<span class="kw3">help</span> <span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
<span class="kw2">cat</span> <span class="co2">&lt;&lt; END<br />
Usage : rename [-t] [-v] [-r] directory<br />
<br />
Options:<br />
&nbsp; -v, --verbose &nbsp; &nbsp;verbose move<br />
&nbsp; -r, --recursive &nbsp;recursive rename<br />
&nbsp; -t, --test &nbsp; &nbsp; &nbsp; don't move, only show change list. Implies -v.<br />
&nbsp; -?, --help &nbsp; &nbsp; &nbsp; show this help<br />
<br />
END</span><br />
<span class="br0">&#125;</span><br />
<br />
<br />
<span class="co0"># ***************</span><br />
<span class="co0"># RENAME FUNCTION</span><br />
<span class="co0"># ***************</span><br />
rename <span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; <span class="kw2">find</span> <span class="re5">-maxdepth</span> <span class="nu0">1</span> <span class="sy0">|</span> \<br />
&nbsp; &nbsp; <span class="kw2">awk</span> <span class="st_h">'{out=tolower($0); \<br />
&nbsp; &nbsp; gsub(&quot; ?\&amp; ?&quot;,&quot;_y_&quot;,out); \<br />
&nbsp; &nbsp; gsub(&quot;\(|\)&quot;,&quot;-&quot;,out); \<br />
&nbsp; &nbsp; gsub(&quot;[\340-\345]&quot;,&quot;a&quot;,out); \<br />
&nbsp; &nbsp; gsub(&quot;\347&quot;,&quot;c&quot;,out); \<br />
&nbsp; &nbsp; gsub(&quot;[\350-\353]&quot;,&quot;e&quot;,out); \<br />
&nbsp; &nbsp; gsub(&quot;[\354-\357]&quot;,&quot;i&quot;,out); \<br />
&nbsp; &nbsp; gsub(&quot;\361&quot;,&quot;n&quot;,out); \<br />
&nbsp; &nbsp; gsub(&quot;[\362-\366]&quot;,&quot;o&quot;,out); \<br />
&nbsp; &nbsp; gsub(&quot;[\371-\374]&quot;,&quot;u&quot;,out); \<br />
&nbsp; &nbsp; gsub(&quot;[^0-9a-z\./_-]&quot;,&quot;_&quot;,out); \<br />
&nbsp; &nbsp; if ($0!=out) {print &quot;\&quot;&quot;$0&quot;\&quot; &quot;out;}}'</span> <span class="sy0">|</span> \<br />
&nbsp; &nbsp; <span class="kw2">xargs</span> <span class="re5">-r</span> <span class="re5">-n</span> <span class="nu0">2</span> <span class="re1">$ECHO</span> <span class="re1">$MOVE</span><br />
<br />
<span class="br0">&#125;</span><br />
<br />
<br />
<span class="co0"># *************</span><br />
<span class="co0"># MAIN FUNCTION</span><br />
<span class="co0"># *************</span><br />
main <span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
<br />
<br />
&nbsp; &nbsp; <span class="co0"># ----------------</span><br />
&nbsp; &nbsp; <span class="co0"># Recursive rename</span><br />
&nbsp; &nbsp; <span class="co0"># ----------------</span><br />
&nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#91;</span> <span class="re1">$recursive</span> <span class="re5">-eq</span> <span class="nu0">1</span> <span class="br0">&#93;</span>; <span class="kw1">then</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">for</span> <span class="kw2">dir</span> <span class="kw1">in</span> <span class="st0">&quot;$1&quot;</span><span class="sy0">/*</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">do</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#91;</span> <span class="re5">-d</span> <span class="st0">&quot;<span class="es2">$dir</span>&quot;</span> <span class="br0">&#93;</span>; <span class="kw1">then</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">cd</span> <span class="st0">&quot;<span class="es2">$dir</span>&quot;</span> <span class="sy0">&amp;&amp;</span> search <span class="st0">&quot;<span class="es2">$dir</span>&quot;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">fi</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">done</span><br />
<br />
&nbsp; &nbsp; <span class="kw1">fi</span><br />
<br />
<br />
&nbsp; &nbsp; <span class="co0"># ----------------------------</span><br />
&nbsp; &nbsp; <span class="co0"># Rename files and directories</span><br />
&nbsp; &nbsp; <span class="co0"># ----------------------------</span><br />
&nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#91;</span> <span class="re1">$verbose</span> <span class="re5">-eq</span> <span class="nu0">1</span> <span class="br0">&#93;</span>; <span class="kw1">then</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">echo</span> <span class="st0">&quot;$1&quot;</span><br />
&nbsp; &nbsp; <span class="kw1">fi</span><br />
<br />
&nbsp; &nbsp; <span class="kw3">cd</span> <span class="st0">&quot;$1&quot;</span> <span class="sy0">&amp;&amp;</span> rename<br />
<br />
<br />
<span class="br0">&#125;</span><br />
<br />
<br />
<span class="co0"># ***************************</span><br />
<span class="co0"># SHOW HELP WITHOUT ARGUMENTS</span><br />
<span class="co0"># ***************************</span><br />
<span class="kw1">if</span> <span class="br0">&#91;</span> <span class="re4">$#</span> <span class="re5">-eq</span> <span class="nu0">0</span> <span class="br0">&#93;</span>; <span class="kw1">then</span><br />
&nbsp; &nbsp;<span class="kw3">help</span><br />
&nbsp; &nbsp;<span class="kw3">exit</span> <span class="nu0">1</span><br />
<span class="kw1">fi</span><br />
<br />
<br />
<span class="co0"># *********</span><br />
<span class="co0"># SHOW HELP</span><br />
<span class="co0"># *********</span><br />
<span class="kw1">if</span> <span class="br0">&#91;</span><span class="br0">&#91;</span> <span class="st0">&quot;$1&quot;</span> =~ <span class="st_h">'(-h|--help)'</span> <span class="br0">&#93;</span><span class="br0">&#93;</span>; <span class="kw1">then</span><br />
&nbsp; &nbsp;<span class="kw3">help</span><br />
&nbsp; &nbsp;<span class="kw3">exit</span> <span class="nu0">0</span><br />
<span class="kw1">fi</span><br />
<br />
<br />
<span class="co0"># ***************</span><br />
<span class="co0"># CHECK ARGUMENTS</span><br />
<span class="co0"># ***************</span><br />
<span class="kw1">while</span> <span class="br0">&#91;</span> <span class="re4">$#</span> <span class="re5">-gt</span> <span class="nu0">1</span> <span class="br0">&#93;</span>; <span class="kw1">do</span><br />
<br />
&nbsp; &nbsp; <span class="kw1">case</span> <span class="st0">&quot;$1&quot;</span> <span class="kw1">in</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; -v<span class="sy0">|</span>--verbose<span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re2">verbose</span>=<span class="nu0">1</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re2">MOVE</span>=<span class="st0">&quot;<span class="es2">$MOVE</span> --verbose&quot;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sy0">;;</span> &nbsp; &nbsp;<br />
&nbsp; &nbsp; &nbsp; &nbsp; -r<span class="sy0">|</span>--recursive<span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re2">recursive</span>=<span class="nu0">1</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sy0">;;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; -t<span class="sy0">|</span>--test<span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re2">verbose</span>=<span class="nu0">1</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re2">MOVE</span>=<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re2">ECHO</span>=<span class="sy0">/</span>bin<span class="sy0">/</span><span class="kw3">echo</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sy0">;;</span> &nbsp; &nbsp;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sy0">*</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">echo</span> invalid argument $<span class="nu0">1</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">help</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">exit</span> <span class="nu0">2</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sy0">;;</span><br />
<br />
&nbsp; &nbsp; <span class="kw1">esac</span><br />
<br />
&nbsp; &nbsp; <span class="kw3">shift</span><br />
<br />
<span class="kw1">done</span><br />
<br />
<br />
<span class="co0"># ****************************************</span><br />
<span class="co0"># CHECK DIRECTORY AND INVOKE MAIN FUNCTION</span><br />
<span class="co0"># ****************************************</span><br />
<span class="kw1">if</span> <span class="br0">&#91;</span> <span class="st0">&quot;$1&quot;</span> == <span class="st_h">'.'</span> <span class="re5">-o</span> <span class="st0">&quot;$1&quot;</span> == <span class="st_h">'*'</span> <span class="br0">&#93;</span>; <span class="kw1">then</span><br />
&nbsp; &nbsp; <span class="re2"><span class="kw2">dir</span></span>=<span class="re1">$PWD</span><br />
<span class="kw1">else</span><br />
&nbsp; &nbsp; <span class="re2"><span class="kw2">dir</span></span>=$<span class="nu0">1</span><br />
<span class="kw1">fi</span><br />
<br />
<span class="kw1">if</span> <span class="br0">&#91;</span> <span class="re5">-d</span> <span class="st0">&quot;<span class="es2">$dir</span>&quot;</span> <span class="br0">&#93;</span>; <span class="kw1">then</span><br />
&nbsp; &nbsp; <span class="kw3">cd</span> <span class="st0">&quot;<span class="es2">$dir</span>&quot;</span><br />
&nbsp; &nbsp; <span class="re2"><span class="kw2">dir</span></span>=<span class="re1">$PWD</span><br />
&nbsp; &nbsp; <span class="kw3">cd</span> - <span class="nu0">1</span><span class="sy0">&gt;</span> <span class="sy0">/</span>dev<span class="sy0">/</span>null<br />
&nbsp; &nbsp; main <span class="st0">&quot;<span class="es2">$dir</span>&quot;</span><br />
&nbsp; &nbsp; <span class="kw3">exit</span> <span class="nu0">0</span><br />
<span class="kw1">else</span><br />
&nbsp; &nbsp; <span class="kw3">echo</span> rename: directory not found<br />
&nbsp; &nbsp; <span class="kw3">exit</span> <span class="nu0">3</span><br />
<span class="kw1">fi</span></div></td></tr></tbody></table></div>
<h3>Otro ejemplo</h3>
<p>Salida de<code>./rename -r -v /shared/music > <a href='http://blog.calcifer.com.ar/uploads/2008/06/result.txt' title='result.txt'>result.txt</a></code></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.calcifer.com.ar/2008/06/renombrar-recursivamente-archivos-y-directorios/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Bash Regular Expressions</title>
		<link>http://blog.calcifer.com.ar/2008/05/bash-regular-expressions/</link>
		<comments>http://blog.calcifer.com.ar/2008/05/bash-regular-expressions/#comments</comments>
		<pubDate>Tue, 27 May 2008 18:41:13 +0000</pubDate>
		<dc:creator>lvidarte</dc:creator>
				<category><![CDATA[None]]></category>
		<category><![CDATA[bash]]></category>
		<category><![CDATA[gnu/linux]]></category>
		<category><![CDATA[regex]]></category>

		<guid isPermaLink="false">http://blog.calcifer.com.ar/2008/05/28/bash-regular-expressions/</guid>
		<description><![CDATA[Vía www.linuxjournal.com
When working with regular expressions in a shell script the norm is to use grep or sed or some other external command/program. Since version 3 of bash (released in 2004) there is another option: bash&#8217;s built-in regular expression comparison operator &#8220;=~&#8221;.
Bash&#8217;s regular expression comparison operator takes a string on the left and an extended [...]]]></description>
			<content:encoded><![CDATA[<div class="from">Vía <a href="http://www.linuxjournal.com/content/bash-regular-expressions" class="linkexternal">www.linuxjournal.com</a></div>
<p>When working with regular expressions in a shell script the norm is to use grep or sed or some other external command/program. Since version 3 of bash (released in 2004) there is another option: bash&#8217;s built-in regular expression comparison operator &#8220;=~&#8221;.</p>
<p>Bash&#8217;s regular expression comparison operator takes a string on the left and an extended regular expression on the right. It returns 0 (success) if the regular expression matches the string, otherwise it returns 1 (failure).</p>
<p>In addition to doing simple matching, bash regular expressions support sub-patterns surrounded by parenthesis for capturing parts of the match. The matches are assigned to an array variable BASH_REMATCH. The entire match is assigned to BASH_REMATCH[0], the first sub-pattern is assigned to BASH_REMATCH[1], etc..</p>
<p>The following example script takes a regular expression as its first argument and one or more strings to match against. It then cycles through the strings and outputs the results of the match process:</p>
<div class="codecolorer-container bash blackboard" style="overflow:auto;white-space:nowrap;width:435px;height:300px"><div class="bash codecolorer" style="font-family:Monaco,Lucida Console,monospace"><span class="co0">#!/bin.bash</span><br />
<br />
<span class="kw1">if</span> <span class="br0">&#91;</span><span class="br0">&#91;</span> <span class="re4">$#</span> <span class="re5">-lt</span> <span class="nu0">2</span> <span class="br0">&#93;</span><span class="br0">&#93;</span>; <span class="kw1">then</span><br />
&nbsp; &nbsp; <span class="kw3">echo</span> <span class="st0">&quot;Usage: $0 PATTERN STRINGS...&quot;</span><br />
&nbsp; &nbsp; <span class="kw3">exit</span> <span class="nu0">1</span><br />
<span class="kw1">fi</span><br />
<span class="re2">regex</span>=$<span class="nu0">1</span><br />
<span class="kw3">shift</span><br />
<span class="kw3">echo</span> <span class="st0">&quot;regex: <span class="es2">$regex</span>&quot;</span><br />
<span class="kw3">echo</span><br />
<br />
<span class="kw1">while</span> <span class="br0">&#91;</span><span class="br0">&#91;</span> $<span class="nu0">1</span> <span class="br0">&#93;</span><span class="br0">&#93;</span><br />
<span class="kw1">do</span><br />
&nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#91;</span><span class="br0">&#91;</span> $<span class="nu0">1</span> =~ <span class="re1">$regex</span> <span class="br0">&#93;</span><span class="br0">&#93;</span>; <span class="kw1">then</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">echo</span> <span class="st0">&quot;$1 matches&quot;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="re2">i</span>=<span class="nu0">1</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="re2">n</span>=<span class="co1">${#BASH_REMATCH[*]}</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">while</span> <span class="br0">&#91;</span><span class="br0">&#91;</span> <span class="re1">$i</span> <span class="re5">-lt</span> <span class="re1">$n</span> <span class="br0">&#93;</span><span class="br0">&#93;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">do</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">echo</span> <span class="st0">&quot; &nbsp;capture[<span class="es2">$i</span>]: <span class="es3">${BASH_REMATCH[$i]}</span>&quot;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">let</span> i++<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">done</span><br />
&nbsp; &nbsp; <span class="kw1">else</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">echo</span> <span class="st0">&quot;$1 does not match&quot;</span><br />
&nbsp; &nbsp; <span class="kw1">fi</span><br />
&nbsp; &nbsp; <span class="kw3">shift</span><br />
<span class="kw1">done</span></div></div>
<p>Assuming the script is saved in &#8220;bashre.sh&#8221;, the following sample shows its output:</p>
<div class="codecolorer-container bash blackboard" style="overflow:auto;white-space:nowrap;width:435px"><div class="bash codecolorer" style="font-family:Monaco,Lucida Console,monospace"><span class="co0"># sh bashre.sh 'aa(b{2,3}[xyz])cc' aabbxcc aabbcc</span><br />
regex: aa<span class="br0">&#40;</span>b<span class="br0">&#123;</span><span class="nu0">2</span>,<span class="nu0">3</span><span class="br0">&#125;</span><span class="br0">&#91;</span>xyz<span class="br0">&#93;</span><span class="br0">&#41;</span><span class="kw2">cc</span><br />
<br />
aabbxcc matches<br />
&nbsp; capture<span class="br0">&#91;</span><span class="nu0">1</span><span class="br0">&#93;</span>: bbx<br />
aabbcc does not match</div></div>
]]></content:encoded>
			<wfw:commentRss>http://blog.calcifer.com.ar/2008/05/bash-regular-expressions/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Consultas XPath desde la línea de comandos</title>
		<link>http://blog.calcifer.com.ar/2007/03/xpath-desde-la-linea-de-comandos/</link>
		<comments>http://blog.calcifer.com.ar/2007/03/xpath-desde-la-linea-de-comandos/#comments</comments>
		<pubDate>Mon, 19 Mar 2007 16:36:42 +0000</pubDate>
		<dc:creator>lvidarte</dc:creator>
				<category><![CDATA[None]]></category>
		<category><![CDATA[bash]]></category>
		<category><![CDATA[w3c]]></category>
		<category><![CDATA[xml]]></category>

		<guid isPermaLink="false">http://blog.calcifer.com.ar/2007/03/19/xpath-desde-la-linea-de-comandos/</guid>
		<description><![CDATA[Existe una aplicación llamada
xmlstarlet
que permite hacer consultas XPath a archivos XML.
Supongamos el siguiente archivo XML, al cual llamaremos libro.xml:
12345678910111213141516171819202122232425262728293031323334&#60;xml version=&#34;1.0&#34; encoding=&#34;UTF-8&#34;&#62;

&#60;libro&#62;

&#60;titulo&#62;Patas arriba&#60;titulo&#62;
&#60;autor&#62;Eduardo Galeano&#60;/autor&#62;

&#60;capitulo num=&#34;1&#34; titulo=&#34;La escuela del mundo al revés&#34;&#62;
&#160; &#160; &#60;seccion num=&#34;1&#34; titulo=&#34;Educando con el ejemplo&#34;&#62;
&#160; &#160; &#160; &#160; &#60;parrafo destacado=&#34;si&#34;&#62;La escuela del mundo al revés es la más democrática de las instituciones educativas.&#60;/parrafo&#62;

&#160; [...]]]></description>
			<content:encoded><![CDATA[<p>Existe una aplicación llamada</p>
<div class="codecolorer-container text " style="overflow:auto;white-space:nowrap;width:435px"><div class="text codecolorer" style="font-family:Monaco,Lucida Console,monospace">xmlstarlet</div></div>
<p>que permite hacer consultas <a href="http://www.w3.org/TR/xpath" class="linkexternal">XPath</a> a archivos XML.</p>
<p>Supongamos el siguiente archivo XML, al cual llamaremos libro.xml:</p>
<div class="codecolorer-container xml " style="overflow:auto;white-space:nowrap;width:435px;height:300px"><table cellspacing="0" cellpadding="0"><tbody><tr><td class="line-numbers"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br />24<br />25<br />26<br />27<br />28<br />29<br />30<br />31<br />32<br />33<br />34<br /></div></td><td><div class="xml codecolorer" style="font-family:Monaco,Lucida Console,monospace"><span class="sc3"><span class="re1">&lt;xml</span> <span class="re0">version</span>=<span class="st0">&quot;1.0&quot;</span> <span class="re0">encoding</span>=<span class="st0">&quot;UTF-8&quot;</span><span class="re2">&gt;</span></span><br />
<br />
<span class="sc3"><span class="re1">&lt;libro<span class="re2">&gt;</span></span></span><br />
<br />
<span class="sc3"><span class="re1">&lt;titulo<span class="re2">&gt;</span></span></span>Patas arriba<span class="sc3"><span class="re1">&lt;titulo<span class="re2">&gt;</span></span></span><br />
<span class="sc3"><span class="re1">&lt;autor<span class="re2">&gt;</span></span></span>Eduardo Galeano<span class="sc3"><span class="re1">&lt;/autor<span class="re2">&gt;</span></span></span><br />
<br />
<span class="sc3"><span class="re1">&lt;capitulo</span> <span class="re0">num</span>=<span class="st0">&quot;1&quot;</span> <span class="re0">titulo</span>=<span class="st0">&quot;La escuela del mundo al revés&quot;</span><span class="re2">&gt;</span></span><br />
&nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;seccion</span> <span class="re0">num</span>=<span class="st0">&quot;1&quot;</span> <span class="re0">titulo</span>=<span class="st0">&quot;Educando con el ejemplo&quot;</span><span class="re2">&gt;</span></span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;parrafo</span> <span class="re0">destacado</span>=<span class="st0">&quot;si&quot;</span><span class="re2">&gt;</span></span>La escuela del mundo al revés es la más democrática de las instituciones educativas.<span class="sc3"><span class="re1">&lt;/parrafo<span class="re2">&gt;</span></span></span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;parrafo<span class="re2">&gt;</span></span></span>El mundo al revés premia al revés.<span class="sc3"><span class="re1">&lt;/parrafo<span class="re2">&gt;</span></span></span><br />
&nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;/seccion<span class="re2">&gt;</span></span></span><br />
<br />
&nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;seccion</span> <span class="re0">num</span>=<span class="st0">&quot;2&quot;</span> <span class="re0">titulo</span>=<span class="st0">&quot;Los alumnos&quot;</span><span class="re2">&gt;</span></span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;parrafo</span> <span class="re0">destacado</span>=<span class="st0">&quot;si&quot;</span><span class="re2">&gt;</span></span>Día tras día, se niega a los niños el derecho de ser niños.<span class="sc3"><span class="re1">&lt;/parrafo<span class="re2">&gt;</span></span></span><br />
&nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;parrafo<span class="re2">&gt;</span></span></span>En el océano del desamparo, se alzan las islas del privilegio.<span class="sc3"><span class="re1">&lt;/parrafo<span class="re2">&gt;</span></span></span><br />
&nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;/seccion<span class="re2">&gt;</span></span></span><br />
<span class="sc3"><span class="re1">&lt;/capitulo<span class="re2">&gt;</span></span></span><br />
<br />
<span class="sc3"><span class="re1">&lt;capitulo</span> <span class="re0">num</span>=<span class="st0">&quot;2&quot;</span> <span class="re0">titulo</span>=<span class="st0">&quot;Cátedras del miedo&quot;</span><span class="re2">&gt;</span></span><br />
&nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;seccion</span> <span class="re0">num</span>=<span class="st0">&quot;1&quot;</span> <span class="re0">titulo</span>=<span class="st0">&quot;La enseñanza del miedo&quot;</span><span class="re2">&gt;</span></span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;parrafo</span> <span class="re0">destacado</span>=<span class="st0">&quot;si&quot;</span><span class="re2">&gt;</span></span>En un mundo que prefiere la seguridad a la justicia, hay cada vez más gente que aplaude el sacrificio de la justicia en los altares de la seguridad.<span class="sc3"><span class="re1">&lt;/parrafo<span class="re2">&gt;</span></span></span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;parrafo<span class="re2">&gt;</span></span></span>A mediados de 1982, ocurrió en Río de Janeiro un hecho de rutina: la policía mató a un sospechoso de hurto.<span class="sc3"><span class="re1">&lt;/parrafo<span class="re2">&gt;</span></span></span><br />
&nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;/seccion<span class="re2">&gt;</span></span></span><br />
<br />
&nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;seccion</span> <span class="re0">num</span>=<span class="st0">&quot;2&quot;</span> <span class="re0">titulo</span>=<span class="st0">&quot;La industria del miedo&quot;</span><span class="re2">&gt;</span></span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;parrafo</span> <span class="re0">destacado</span>=<span class="st0">&quot;si&quot;</span><span class="re2">&gt;</span></span>El miedo es la materia prima de las prósperas industrias de la seguridad privada y del control social.<span class="sc3"><span class="re1">&lt;/parrafo<span class="re2">&gt;</span></span></span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;parrafo<span class="re2">&gt;</span></span></span>&quot;Nuestra mejor publicidad son los noticieros de la televisión&quot;, dice, y bien sabe lo que dice, uno de los especialistas en la venta de seguridad.<span class="sc3"><span class="re1">&lt;/parrafo<span class="re2">&gt;</span></span></span><br />
&nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;/seccion<span class="re2">&gt;</span></span></span><br />
<br />
<span class="sc3"><span class="re1">&lt;/capitulo<span class="re2">&gt;</span></span></span><br />
<br />
<span class="sc3"><span class="re1">&lt;/libro<span class="re2">&gt;</span></span></span></div></td></tr></tbody></table></div>
<h3>Consultas</h3>
<p>Obtener el título del libro:</p>
<div class="codecolorer-container bash " style="overflow:auto;white-space:nowrap;width:435px"><div class="bash codecolorer" style="font-family:Monaco,Lucida Console,monospace">xmlstarlet <span class="kw1">select</span> <span class="re5">-t</span> <span class="re5">-v</span> <span class="sy0">//</span>titulo libro.xml</div></div>
<p>Obtener el capítulo 1:</p>
<div class="codecolorer-container bash " style="overflow:auto;white-space:nowrap;width:435px"><div class="bash codecolorer" style="font-family:Monaco,Lucida Console,monospace">xmlstarlet <span class="kw1">select</span> <span class="re5">-t</span> <span class="re5">-v</span> <span class="st0">&quot;//capitulo[@num='1']&quot;</span> libro.xml</div></div>
<p>Obtener el capítulo 2:</p>
<div class="codecolorer-container bash " style="overflow:auto;white-space:nowrap;width:435px"><div class="bash codecolorer" style="font-family:Monaco,Lucida Console,monospace">xmlstarlet <span class="kw1">select</span> <span class="re5">-t</span> <span class="re5">-v</span> <span class="st0">&quot;//capitulo[2]&quot;</span> libro.xml</div></div>
<p>Obtener el capítulo 2 usando last():</p>
<div class="codecolorer-container bash " style="overflow:auto;white-space:nowrap;width:435px"><div class="bash codecolorer" style="font-family:Monaco,Lucida Console,monospace">xmlstarlet <span class="kw1">select</span> <span class="re5">-t</span> <span class="re5">-v</span> <span class="st0">&quot;//capitulo[last()]&quot;</span> libro.xml</div></div>
<p>Obtener la sección 1 del capítulo 2:</p>
<div class="codecolorer-container bash " style="overflow:auto;white-space:nowrap;width:435px"><div class="bash codecolorer" style="font-family:Monaco,Lucida Console,monospace">xmlstarlet <span class="kw1">select</span> <span class="re5">-t</span> <span class="re5">-v</span> <span class="st0">&quot;/libro/capitulo[@num='2']/seccion[@num='1']&quot;</span> libro.xml</div></div>
<p>Obtener los párrafos que contienen algún atributo:</p>
<div class="codecolorer-container bash " style="overflow:auto;white-space:nowrap;width:435px"><div class="bash codecolorer" style="font-family:Monaco,Lucida Console,monospace">xmlstarlet <span class="kw1">select</span> <span class="re5">-t</span> <span class="re5">-c</span> <span class="st_h">'//parrafo[@*]'</span> libro.xml</div></div>
<p>Obtener los párrafos no destacados del capítulo 1:</p>
<div class="codecolorer-container bash " style="overflow:auto;white-space:nowrap;width:435px"><div class="bash codecolorer" style="font-family:Monaco,Lucida Console,monospace">xmlstarlet <span class="kw1">select</span> <span class="re5">-t</span> <span class="re5">-c</span> <span class="st0">&quot;/libro/capitulo[@num='1']//parrafo[not(@destacado)]&quot;</span> libro.xml</div></div>
<h3>Parámetros</h3>
<div class="codecolorer-container bash " style="overflow:auto;white-space:nowrap;width:435px"><div class="bash codecolorer" style="font-family:Monaco,Lucida Console,monospace">Syntax <span class="kw1">for</span> templates: -t<span class="sy0">|</span>--template <span class="sy0">&lt;</span>options<span class="sy0">&gt;</span><br />
where <span class="sy0">&lt;</span>options<span class="sy0">&gt;</span><br />
&nbsp; <span class="re5">-c</span> or <span class="re5">--copy-of</span> <span class="sy0">&lt;</span>xpath<span class="sy0">&gt;</span> &nbsp; &nbsp; &nbsp; &nbsp; - print copy of XPATH expression<br />
&nbsp; <span class="re5">-v</span> or <span class="re5">--value-of</span> <span class="sy0">&lt;</span>xpath<span class="sy0">&gt;</span> &nbsp; &nbsp; &nbsp; &nbsp;- print value of XPATH expression<br />
&nbsp; <span class="re5">-o</span> or <span class="re5">--output</span> <span class="sy0">&lt;</span>string<span class="sy0">&gt;</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;- output string literal<br />
&nbsp; <span class="re5">-n</span> or <span class="re5">--nl</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; - print new line<br />
&nbsp; <span class="re5">-f</span> or <span class="re5">--inp-name</span> &nbsp; &nbsp; &nbsp; &nbsp; - print input <span class="kw2">file</span> name <span class="br0">&#40;</span>or URL<span class="br0">&#41;</span><br />
&nbsp; <span class="re5">-m</span> or <span class="re5">--match</span> <span class="sy0">&lt;</span>xpath<span class="sy0">&gt;</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; - match XPATH expression<br />
&nbsp; <span class="re5">-i</span> or <span class="re5">--if</span> <span class="sy0">&lt;</span>test-xpath<span class="sy0">&gt;</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;- check condition <span class="sy0">&lt;</span>xsl:<span class="kw1">if</span> <span class="re2"><span class="kw3">test</span></span>=<span class="st0">&quot;test-xpath&quot;</span><span class="sy0">&gt;</span><br />
&nbsp; <span class="re5">-e</span> or <span class="re5">--elem</span> <span class="sy0">&lt;</span>name<span class="sy0">&gt;</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;- print out element <span class="sy0">&lt;</span>xsl:element <span class="re2">name</span>=<span class="st0">&quot;name&quot;</span><span class="sy0">&gt;</span><br />
&nbsp; <span class="re5">-a</span> or <span class="re5">--attr</span> <span class="sy0">&lt;</span>name<span class="sy0">&gt;</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;- add attribute <span class="sy0">&lt;</span>xsl:attribute <span class="re2">name</span>=<span class="st0">&quot;name&quot;</span><span class="sy0">&gt;</span><br />
&nbsp; <span class="re5">-b</span> or <span class="re5">--break</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;- <span class="kw3">break</span> nesting<span class="sy0">&lt;/</span>xsl:attribute<span class="sy0">&gt;&lt;/</span>name<span class="sy0">&gt;&lt;/</span>xsl:element<span class="sy0">&gt;&lt;/</span>name<span class="sy0">&gt;&lt;/</span>xsl:<span class="kw1">if</span><span class="sy0">&gt;&lt;/</span>test-xpath<span class="sy0">&gt;&lt;/</span>xpath<span class="sy0">&gt;&lt;/</span>string<span class="sy0">&gt;&lt;/</span>xpath<span class="sy0">&gt;&lt;/</span>xpath<span class="sy0">&gt;&lt;/</span>options<span class="sy0">&gt;&lt;/</span>options<span class="sy0">&gt;</span></div></div>
<p class="from">Sitio oficial: <a href="http://xmlstar.sourceforge.net/" class="linkexternal">XMLStarlet Command Line XML Toolkit</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.calcifer.com.ar/2007/03/xpath-desde-la-linea-de-comandos/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Bash Shell Shortcuts</title>
		<link>http://blog.calcifer.com.ar/2006/10/bash-shell-shortcuts/</link>
		<comments>http://blog.calcifer.com.ar/2006/10/bash-shell-shortcuts/#comments</comments>
		<pubDate>Mon, 30 Oct 2006 19:52:45 +0000</pubDate>
		<dc:creator>lvidarte</dc:creator>
				<category><![CDATA[bash]]></category>

		<guid isPermaLink="false">http://blog.calcifer.com.ar/2006/10/30/bash-shell-shortcuts/</guid>
		<description><![CDATA[Este post podría llamarse: &#8220;Sin razones para sacar la mano derecha de la línea media del teclado&#8221; :P
Una aclaración que vale hacer al respecto de esta lista es que el tratamiento de &#8220;palabras&#8221; es, a menos que se indique lo contrario, lexicográfico.
Crtl
Ctrl + a &#8211; Salta al comienzo de la línea
Ctrl + b &#8211; Mueve [...]]]></description>
			<content:encoded><![CDATA[<p>Este post podría llamarse: &#8220;<strong>Sin razones para sacar la mano derecha de la línea media del teclado</strong>&#8221; :P</p>
<p>Una aclaración que vale hacer al respecto de esta lista es que el tratamiento de &#8220;palabras&#8221; es, a menos que se indique lo contrario, lexicográfico.</p>
<h3>Crtl</h3>
<p><span class="pink">Ctrl + a</span> &#8211; Salta al comienzo de la línea<br />
<span class="pink">Ctrl + b</span> &#8211; Mueve el cursor un caracter atrás<br />
<span class="pink">Ctrl + c</span> &#8211; Termina el comando/programa<br />
<span class="pink">Ctrl + d</span> &#8211; Borra el caracter bajo el cursor<br />
<span class="pink">Ctrl + e</span> &#8211; Salta al final de la línea<br />
<span class="pink">Ctrl + f</span> &#8211; Mueve el cursor un caracter adelante<br />
<span class="pink">Ctrl + h</span> &#8211; Borra un caracter hacia atrás (símil Backspace)<br />
<span class="pink">Ctrl + k</span> &#8211; Corta desde el cursor hasta el final de la línea<br />
<span class="pink">Ctrl + l</span> &#8211; Borra la terminal<br />
<span class="pink">Ctrl + r</span> &#8211; Búsqueda hacia atrás en la historia de comandos<br />
<span class="pink">Ctrl + t</span> &#8211; Intercambia de posición las dos ultimas palabras de la línea<br />
<span class="pink">Ctrl + u</span> &#8211; Corta desde el comienzo de la línea hasta la posición del cursor<br />
<span class="pink">Ctrl + w</span> &#8211; Borra hacia atrás el token completo (no lexicográfico) (ver</p>
<div class="codecolorer-container text " style="overflow:auto;white-space:nowrap;width:435px"><div class="text codecolorer" style="font-family:Monaco,Lucida Console,monospace">Alt+Backspace</div></div>
<p>)<br />
<span class="pink">Ctrl x Ctrl e</span> &#8211; Invoca a $EDITOR<br />
<span class="pink">Ctrl + xx</span> &#8211; Mueve el cursor entre las dos ultimas posiciones en que se encontró<br />
<span class="pink">Ctrl + x @</span> &#8211; Muestra los nombres de host que pueden ser resueltos (/etc/hosts)<br />
<span class="pink">Ctrl + y</span> &#8211; Pega (yank) lo cortado previamente con</p>
<div class="codecolorer-container text " style="overflow:auto;white-space:nowrap;width:435px"><div class="text codecolorer" style="font-family:Monaco,Lucida Console,monospace">Ctrl+k</div></div>
<p>o</p>
<div class="codecolorer-container text " style="overflow:auto;white-space:nowrap;width:435px"><div class="text codecolorer" style="font-family:Monaco,Lucida Console,monospace">Ctrl+u</div></div>
<p><span class="pink">Ctrl + z</span> &#8211; Suspende/Detiene el comando</p>
<h3>Alt</h3>
<p><span class="pink">Alt + <</span> &#8211; Trae la primera línea en la historia<br />
<span class="pink">Alt + ></span> &#8211; Trae la última línea en la historia<br />
<span class="pink">Alt + ?</span> &#8211; Muestra la lista de nombres que coinciden con lo escrito<br />
<span class="pink">Alt + *</span> &#8211; Inserta como argumentos todos los nombres que coinciden con lo escrito<br />
<span class="pink">Alt + b</span> &#8211; Mueve el cursor una palabra atrás<br />
<span class="pink">Alt + c</span> &#8211; Capitaliza la palabra desde el cursor al final de la misma<br />
<span class="pink">Alt + d</span> &#8211; Borra la palabra bajo el cursor<br />
<span class="pink">Alt + f</span> &#8211; Mueve el cursor una palabra adelante<br />
<span class="pink">Alt + l</span> &#8211; Convierte en minúsculas, desde el cursor al final de la palabra<br />
<span class="pink">Alt + n</span> &#8211; Trae la línea siguiente en la historia (como flecha abajo)<br />
<span class="pink">Alt + p</span> &#8211; Trae la línea anterior en la historia (como flecha arriba)<br />
<span class="pink">Alt + r</span> &#8211; Deshace todos los cambios hechos a la línea<br />
<span class="pink">Alt + t</span> &#8211; Intercambia de posición dos palabras adyacentes<br />
<span class="pink">Alt + u</span> &#8211; Convierte en mayúsculas, desde el cursor al final de la palabra<br />
<span class="pink">Alt + Backspace</span> &#8211; Borra hacia atrás la palabra (ver</p>
<div class="codecolorer-container text " style="overflow:auto;white-space:nowrap;width:435px"><div class="text codecolorer" style="font-family:Monaco,Lucida Console,monospace">Crtl+w</div></div>
<p>)</p>
<p><span id="more-76"></span></p>
<h3>Tab</h3>
<p><em>&#8220;2T&#8221; significa persionar dos veces TAB</em></p>
<p><span class="pink">2T</span> &#8211; Lista de todos los comandos disponibles<br />
<span class="pink">(string)2T</span> &#8211; Lista de todos los comandos que comienzan con string<br />
<span class="pink">/2T</span> &#8211; Contenido del directorio<br />
<span class="pink">~2T</span> &#8211; Lista todos los usuarios disponibles en el sistema (/etc/passwd)<br />
<span class="pink">$2T</span> &#8211; Lista de todas las variables del sistema<br />
<span class="pink">=2T</span> &#8211; Similar a ls</p>
<h3>Otros</h3>
<p><span class="pink">!<enter></span> &#8211; Repite el último comando en la historia<br />
<span class="pink">!#</span> &#8211; Repite la línea # en la historia<br />
<span class="pink">$_</span> &#8211; Variable que contiene el último argumento del último comando</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.calcifer.com.ar/2006/10/bash-shell-shortcuts/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Liberado un curso de The Gimp</title>
		<link>http://blog.calcifer.com.ar/2006/10/liberado-un-curso-de-the-gimp/</link>
		<comments>http://blog.calcifer.com.ar/2006/10/liberado-un-curso-de-the-gimp/#comments</comments>
		<pubDate>Wed, 11 Oct 2006 03:25:59 +0000</pubDate>
		<dc:creator>lvidarte</dc:creator>
				<category><![CDATA[None]]></category>
		<category><![CDATA[bash]]></category>
		<category><![CDATA[design]]></category>
		<category><![CDATA[gnu/linux]]></category>

		<guid isPermaLink="false">http://blog.calcifer.com.ar/2006/10/11/liberado-un-curso-de-the-gimp/</guid>
		<description><![CDATA[Vía Menéame >
José Sanchez, de la Universidad de Málaga, nos ofrece un curso del programa de retoque fotográfico por excelencia para Gnu/Linux. El curso se puede descargar en formato imprimible (pdf) y en version comprimida con las fuentes en ODT para modificarlo, siempre de acuerdo a su licencia cc: Reconocimiento-NoComercial-CompartirIgual.

Capítulo 1: Instalación y arranque
Capítulo 2: [...]]]></description>
			<content:encoded><![CDATA[<p class="from">Vía <a href="http://meneame.net/story/liberado-un-curso-de-the-gimp" title="" class="linkexternal">Menéame</a> ></p>
<p>José Sanchez, de la Universidad de Málaga, nos ofrece un <a href="http://sanchezrodri.googlepages.com/" title="Curso Gimp" class="linkexternal">curso</a> del programa de retoque fotográfico por excelencia para Gnu/Linux. El curso se puede descargar en formato imprimible (pdf) y en version comprimida con las fuentes en ODT para modificarlo, siempre de acuerdo a su licencia cc: Reconocimiento-NoComercial-CompartirIgual.</p>
<ul>
<li><a href="http://sanchezrodri.googlepages.com/ManualGIMP_Cap1.pdf" title="" class="linkexternal">Capítulo 1: Instalación y arranque</a></li>
<li><a href="http://sanchezrodri.googlepages.com/ManualGIMP_Cap2.pdf" title="" class="linkexternal">Capítulo 2: Nueva imagen y herramientas</a></li>
<li><a href="http://sanchezrodri.googlepages.com/ManualGIMP_Cap3.pdf" title="" class="linkexternal">Capítulo 3: Otras operaciones comunes</a></li>
<li><a href="http://sanchezrodri.googlepages.com/ManualGIMP_Cap4.pdf" title="" class="linkexternal">Capítulo 4: Los textos y las capas</a></li>
<li><a href="http://sanchezrodri.googlepages.com/ManualGIMP_Cap5.pdf" title="" class="linkexternal">Capítulo 5: Máscaras y selecciones</a></li>
<li><a href="http://sanchezrodri.googlepages.com/ManualGIMP_Cap6.pdf" title="" class="linkexternal">Capítulo 6: Los colores</a></li>
<li><a href="http://sanchezrodri.googlepages.com/ManualGIMP_Cap7.pdf" title="" class="linkexternal">Capítulo 7: Los filtros (I)</a></li>
<li><a href="http://sanchezrodri.googlepages.com/ManualGIMP_Cap8.pdf" title="" class="linkexternal">Capítulo 8: Los filtros (II)</a></li>
<li><a href="http://sanchezrodri.googlepages.com/ManualGIMP_Cap9.pdf" title="" class="linkexternal">Capítulo 9: Script-Fu</a></li>
</ul>
<p>Desde bash</p>
<div class="codecolorer-container bash blackboard" style="overflow:auto;white-space:nowrap;width:435px"><div class="bash codecolorer" style="font-family:Monaco,Lucida Console,monospace"><span class="kw1">for</span> i <span class="kw1">in</span> <span class="sy0">`</span><span class="kw2">seq</span> <span class="nu0">1</span> <span class="nu0">9</span><span class="sy0">`</span> ; \<br />
<span class="kw1">do</span> <span class="kw2">wget</span> http:<span class="sy0">//</span>sanchezrodri.googlepages.com<span class="sy0">/</span>ManualGIMP_Cap<span class="re1">$i</span>.pdf; \<br />
<span class="kw1">done</span></div></div>
]]></content:encoded>
			<wfw:commentRss>http://blog.calcifer.com.ar/2006/10/liberado-un-curso-de-the-gimp/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Caracteres de salto de línea</title>
		<link>http://blog.calcifer.com.ar/2006/08/caracteres-de-salto-de-linea/</link>
		<comments>http://blog.calcifer.com.ar/2006/08/caracteres-de-salto-de-linea/#comments</comments>
		<pubDate>Fri, 18 Aug 2006 14:50:57 +0000</pubDate>
		<dc:creator>lvidarte</dc:creator>
				<category><![CDATA[None]]></category>
		<category><![CDATA[bash]]></category>
		<category><![CDATA[computers]]></category>

		<guid isPermaLink="false">http://blog.calcifer.com.ar/2006/08/18/%c2%bfque-es-n/</guid>
		<description><![CDATA[Mix entre un artículo de Xavier Noria sobre el famoso\ny datos de Wikipedia.
¿Qué es \n?
Por razones históricas no existe un único código para representar inequívocamente una nueva línea. El código ASCII 10 (0&#215;0A) se conoce técnicamente como &#8220;new line&#8221;, pero la actual representación de newlines depende del sistema operativo o de la aplicación corriendo sobre [...]]]></description>
			<content:encoded><![CDATA[<p class="from">Mix entre un <a href="http://www.onlamp.com/pub/a/onlamp/2006/08/17/understanding-newlines.html" class="linkexternal">artículo de Xavier Noria</a> sobre el famoso<code>\n</code>y datos de <a href="http://es.wikipedia.org/wiki" class="linkwikipedia">Wikipedia</a>.</p>
<h4>¿Qué es \n?</h4>
<p>Por razones históricas no existe un único código para representar inequívocamente una <em>nueva línea</em>. El código ASCII 10 (0&#215;0A) se conoce técnicamente como &#8220;new line&#8221;, pero la actual representación de newlines depende del sistema operativo o de la aplicación corriendo sobre éste.</p>
<p>Los códigos usados para representar newlines en sistemas basados en ASCII son:</p>
<ul>
<li>LF: Line Feed,<code>"\cJ"</code>, Unicode<code>000A</code>, ASCII<code>0x0A</code>,<code>012</code>,<code>10</code>.</li>
<li>CR: Carriage Return,<code>"\cM"</code>, Unicode<code>000D</code>, ASCII<code>0x0D</code>,<code>015</code>,<code>13</code>.</li>
<li>CRLF: Ambos códigos juntos y en este orden.</li>
</ul>
<p>Entonces, tenemos que existen tres tipos distintos de newlines, dependiendo del SO que se trate:</p>
<ul>
<li>LF: Unix y sistemas tipo Unix como Linux, Mac OS X, AIX, Xenix, BeOS, Amiga, RISC OS y otros.</li>
<li>CR: Familia Apple II y Mac OS hasta la versión 9.</li>
<li>CRLF: Microsoft Windows, WinCE, DOS, OS/2, CP/M, MP/M, y otros.</li>
</ul>
<p>Si abrimos un editor de texto, en tres computadoras distintas corriendo un SO de cada una de estas tres familias, y escribimos &#8220;<code>x + Return + y"</code no_cc="true"> en cada una y guardamos el archivo, el resultado en disco es distinto. De acuerdo con la nomenclatura explicada arriba, veríamos estos bytes:</p>
<ul>
<li>Ubuntu GNU/Linux: <code no_cc="true">120.10.121</code></li>
<li>Mac OS 9:<code>120.13.121</code></li>
<li>Windows NT:<code>120.13.10.121</code></li>
</ul>
<p><span id="more-27"></span></p>
<h4>¿De dónde viene CRLF? </h4>
<p>La secuencia<code>CR LF</code>era común en los primeros ordenadores que tenían máquinas de <span class="new">teletipo</span> (como el <span class="new">ASR33</span>) como dispositivo de <a title="Terminal" href="http://es.wikipedia.org/wiki/Terminal" class="linkwikipedia">terminal</a>. Esta secuencia era necesaria para posicionar el cabezal de la impresora al principio de una nueva línea. Como esta operación no se podía hacer en tiempo "1 carácter", había que dividirla en dos caracteres. A veces era necesario enviar<code>CR LF NUL</code>(siendo<code>NUL</code>el carácter de control que le manda "no hacer nada"), para asegurarse de que el cabezal de impresión parara de moverse. Después de que estos sistemas mecánicos desaparecieran, la secuencia<code>CR LF</code>dejó de tener sentido, pero aún así se ha seguido usando.</p>
<h3>Problemas comunes</h3>
<p>Las diferentes representaciones de la <em>nueva línea</em> en los sistemas operativos a veces causan que al transferir un fichero entre dos ordenadores, se muestre incorrectamente. Por ejemplo, en condiciones normales, los ficheros creados en sistemas Unix o Apple Macintosh se verán como una línea larga en Windows. Y a la inversa: los ficheros creados con Windows se verán extraños con algunos editores, ya que el<code>CR</code>extra que Unix no necesita se mostrará como un <tt>^M</tt> al final de cada línea. Caso típico cuando editamos en <a href="http://es.wikipedia.org/wiki/Vi" class="linkwikipedia">VI</a> un archivo proveniente de Windows.</p>
<p>El problema puede ser difícil de detectar si algunos programas manejan bien los terminadores de línea ajenos pero otros no. Por ejemplo, un compilador puede fallar con extraños mensajes de error aún cuando el fichero fuente se muestra correcto en la línea de comandos o un editor de texto.</p>
<p>Los navegadores web suelen poder trabajar con páginas codificadas en cualquier sistema, y los editores de texto modernos permiten no sólo abrir ficheros de cualquier codificación, sino convertir entre ellas (ver siguiente sección).</p>
<p>Al transferir ficheros por FTP, el cliente puede convertir automáticamente entre diferentes codificaciones si está activado el modo de texto. Si el modo es binario, el fichero llegará corrupto. Los programas suelen usar heurísticos para detectar si un fichero es binario o no, pero pueden equivocarse.</p>
<h3> Utilidades de conversión</h3>
<p>En muchos sistemas Unix se encuentran las utilidades<code>dos2unix</code>y<code>unix2dos</code>, que transforman entre las codificaciones<code>CRLF</code>(DOS/Windows) y<code>LF</code>(Unix). Hay varias versiones de estos programas, con sintaxis algo distintas.</p>
<p>Se puede usar también el programa<code>tr</code>, que sí que está en cualquier sistema tipo Unix, y que permite hacer cualquier tipo de transformación de caracteres. Para pasar de DOS/Windows a Unix, eliminar todos los CR:</p>
<div class="codecolorer-container text " style="overflow:auto;white-space:nowrap;width:435px"><div class="text codecolorer" style="font-family:Monaco,Lucida Console,monospace">tr -d 'r' &lt; fichero_entrada &gt; fichero_salida</div></div>
<p>Y en la otra dirección: se puede convertir de Unix a DOS con sed:</p>
<div class="codecolorer-container text " style="overflow:auto;white-space:nowrap;width:435px"><div class="text codecolorer" style="font-family:Monaco,Lucida Console,monospace">sed -e 's/$/r/' fichero_entrada &gt; fichero_salida</div></div>
<p>En sistemas Unix está el comando<code>file</code>, que permite identificar el tipo de terminadores de línea que usa un fichero.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.calcifer.com.ar/2006/08/caracteres-de-salto-de-linea/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

