Article View: es.comp.os.linux.programacion
Article #13238Re: Sustituir una sola vez con sed (o perl)
From: Claudio S. Suarez
Date: Sat, 10 Mar 2001 23:02
Date: Sat, 10 Mar 2001 23:02
94 lines
4298 bytes
4298 bytes
Hola Han:
El 06 Mar 2001 15:44:07 +0100, Han Solo escribi�:
>-----BEGIN PGP SIGNED MESSAGE-----
>Hash: SHA1
>
>Hola a todos.
>
>Tengo una duda con sed. �como se hace para que sustituya un texto *una
>sola vez* en un fichero le�do de la antrada est�ndar?. La idea, es
>meter una p�gina en blanco en un fichero ps antes de pasarlo por
>psnup, para que luego queden bien ordenadas al sacar dos p�ginas por
>cara. Se trata de sustituir el primer %%Page: por
>
>
>%----------------
>%%Page: 0 0
>showpage
>%----------------
>%%Page:
>
>El problema es que la cadena %%Page: aparece en cada salto de p�gina,
>y esto se trata s�lo de ponerlo en el primer salto, para que meta una
>p�gina en blanco.
>
>He conseguido que lo sustituya, pero la sutituci�n la hace en todas
>las p�ginas. Lo que quiero es que lo haga una sola vez.
Sed est� pensado para hacer sustituciones en todo un texto
y, segun recuerdo, solo puede seleccionar lineas en funci�n de
expresiones regulares o de n�meros de linea. No creo que valga
porque el programa necesita una variable para saber si ya
se ha hecho el cambio o no, y el sed no las tiene
(aunque la gente del gnu le a�ade todo tipo de extras y
vaya Vd. a saber).
Para estas labores, mejor el awk, que es un lenguaje de programaci�n
de sintaxis similar al C, orientado a tratar ficheros de texto.
Se pueden usar variables, estructuras de control,...
la sintaxis de las lineas es:
selector { acci�n}
Sobre las lineas que verifiquen "selector" se ejecutar� la
acci�n que le digas. El selector es una expresi�n con los
operadores de C y otro comprobar expresiones regulares.
El selector especial BEGIN se hace al principio.
Podr�a valer:
awk 'BEGIN {hacermas=1}
hacermas && /Page:/ {print "%----\nPage: 0 0\nshowpage%----\nPage:"
' fichero
El perl dice que hace casi todo lo de la shell, el sed y el awk.
En este caso cumple:
perl -pe 'if ($i!=1 && s/Page/%-----& 0 0\nshowpage\n%-----\n&/) {$i=1}'
Tambi�n se puede hacer con la shell, pero es ineficiente:
--filtro.sh-----
#!/bin/sh
cambiado=0
cat $1 | while read a; do
if [ $cambiado = 0 -a "$a" = Page: ]; then
echo "%----\nPage: 0 0\nshowpage%----\nPage:"
else
echo "$a"
fi
done
----------------------------------------
Claro, que si hay problemas de eficiencia, mejor un programa
compilado. En este caso es cortito:
------------filtro.lex---------
%s ENCONTRADO
%%
<INITIAL>Page: {
BEGIN (ENCONTRADO);
puts("%--------\nPage: 00\nshowpage%-------\nPage:"); }
%%
-------------------------------------
Se hace el programa en C con
$ flex filtro.lex
Y se compila con:
$ cc -lfl xx.o lex.yy.c -o filtro
La libfl.so es una librer�a auxiliar al flex, como la libl.so
es auxiliar al lex. El xx.o lo he tenido que poner porque
me da un error raro (e inexplicable para mi). Se
obtiene al compilar: cc -c xx.c
-----xx.c-------
int yywrap(){return 1;}
---------------
Un saludo.
--claudio--
Technical Details
Message-ID:
<slrn9alckc.6j.claudio@cacho.celta>Path:
arc1-ca.pugleaf.net!supernews.google.com!sn-xit-03!supernews.com!newsfeed.wirehub.nl!news.stealth.net!newsfeed.rt.ru!news-sto.telia.net!195.206.66.162.MISMATCH!Amsterdam.Infonet!News.Amsterdam.UnisourceCS!newsinternetskywayteltow!post.skyway.de!news.jazztel.es!ningun.host!claudioReferences:
<8766hn6jpk.fsf@alderaan.maptel.es>Show Full Headers
Complete Article Headers
X-Google-Language: SPANISH,ASCII X-Google-Thread: f86c8,57bf867c8699b7fc X-Google-Attributes: gidf86c8,public X-Google-ArrivalTime: 2001-03-10 16:28:07 PST Path: arc1-ca.pugleaf.net!supernews.google.com!sn-xit-03!supernews.com!newsfeed.wirehub.nl!news.stealth.net!newsfeed.rt.ru!news-sto.telia.net!195.206.66.162.MISMATCH!Amsterdam.Infonet!News.Amsterdam.UnisourceCS!newsinternetskywayteltow!post.skyway.de!news.jazztel.es!ningun.host!claudio From: claudio@ningun.sitio.es (Claudio S. Suarez) Newsgroups: es.comp.os.linux.programacion Subject: Re: Sustituir una sola vez con sed (o perl) Lines: 94 Message-ID: <slrn9alckc.6j.claudio@cacho.celta> References: <8766hn6jpk.fsf@alderaan.maptel.es> Mime-Version: 1.0 Content-Type: text/plain; charset=iso-8859-1 Content-Transfer-Encoding: 8bit X-Server-Date: 10 Mar 2001 23:02:38 GMT X-Newsreader: slrn (0.9.4.3 UNIX) Date: 10 Mar 2001 23:02:38 GMT NNTP-Posting-Host: 212.106.224.27 X-Complaints-To: newsmaster@jazztel.com X-Trace: news.jazztel.es 984269514 212.106.224.27 (Sun, 11 Mar 2001 01:11:54 CET) NNTP-Posting-Date: Sun, 11 Mar 2001 01:11:54 CET Organization: Jazztel