🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: es.comp.os.linux.programacion
Article #13238

Re: Sustituir una sola vez con sed (o perl)

#13238
From: Claudio S. Suarez
Date: Sat, 10 Mar 2001 23:02
94 lines
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!claudio
References: <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