🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

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

Re: Sustituir cadenas con sed

#8195
From: Humitsec
Date: Sat, 28 Dec 2002 02:05
63 lines
4184 bytes
Vayamos por partes.

En primer lugar, la forma para seleccionar campos de la expresi�n 
regular inicial y copiarlas tal cual en la expresi�n de sustituci�n es 
delimit�ndola entre \( y \) en la expresi�n regular, y referenci�ndola 
en la expresi�n de sustituci�n mediante \n, siendo 'n' el n�mero de 
expresi�n seleccionada, utilizando \1 para la primera expresi�n, \2 para 
la segunda, y as� sucesivamente.

Por ejemplo, tenemos un fichero llamado �enlaces� que contiene un 
listado de nombres de fichero del tipo �nombre.htm�, y queremos que 
estas referencias pasen a ser del tipo �nombre.html�. En este caso 
ejecutar�amos:

sed -e 's/\(.*\)htm/\1html/' enlaces

Ahora vamos a analizar esta expresi�n. La expresi�n regular empleada es 
�\(.*\)htm�. Hemos dicho que con \( y \) delimitamos un campo en dicha 
expresi�n para ser luego referenciada en la sutituci�n. De esta forma, 
la expresi�n regular podr�a entenderse como �.*htm�, considerando que 
todo aquello que resulte referenciado de .* ser� guardado como primera 
variable, y se podr� incluir tantas veces como se quiera en la 
sustituci�n utilizando \1, por ser la primera variable.

As� pues, la expresi�n regular anterior haria referencia a cualquier 
cadena de caracteres (esto es a lo que se referencia con .*), seguida de 
la cadena �htm�.

La sustituci�n en este caso se realizaria a el contenido obtenido de la 
primera variable (a esto nos referimos al poner \1), seguido de la 
cadena �html�.

Es recomendable que practiques un poco con esto para cogerle el truco. 
Ten en cuenta que puedes utilizar \( y \) tantas veces como quieras en 
la expresi�n regular, teniendo presente que cada vez que quieras incluir 
su contenido en la sustituci�n debes utilizar el n�mero de la variable 
que corresponda.

Ahora otro detalle sobre el ejemplo que pon�as. La 'g' que pones al 
final solo es �til cuando la expresi�n regular buscada puede darse m�s 
de una vez en la misma l�nea de un fichero.

Por ejemplo, en el ejemplo anterior deber�amos utilizar la 'g', si en el 
fichero �enlaces� se diera el caso de una l�nea que contuviera la cadena 
�nombre1.htm nombre2.htm�.

Para el caso que pides, una construcci�n v�lida (no es la mejor, pero 
sirve), podr�a ser:

sed -e 's/play_wav(\(.*\),.*,.*);/play_wav(\1);/' fichero

Como ves, no es necesario que hagas un cat y se lo pases con un pipe. 
Basta con que pongas el nombre del fichero a editar a continuaci�n de la 
orden que le pasas a sed.

Si quieres guardar los cambios en un fichero, solo tienes que 
redireccionar la salida como siempre, a�adiendo al final �> fichero2�.

Una cosa m�s. Si quieres aprender algo m�s sobre sed, te recomiendo el 
libro �sed & awk� de O'Reilly, en su segunda edici�n. All� te explican 
todo lo que necesitas para dominar sed. Otro recurso tambi�n muy 
interesante es el manual de sed del proyecto GNU, que te puedes 
descargar en varios formatos desde su p�gina oficial.
Technical Details
Message-ID: <3E0D06D8.6080604@privacy.net>
Path: arc1-ca.pugleaf.net!archiver1.google.com!news1.google.com!newsfeed.stanford.edu!news-spur1.maxwell.syr.edu!news.maxwell.syr.edu!newsfeed.icl.net!newsfeed.fjserv.net!newsfeed.freenet.de!news.tu-darmstadt.de!fu-berlin.de!uni-berlin.de!130-mad2-x45.libre.retevision.ES!not-for-mail
References: <pan.2002.12.28.00.23.57.689990.8042@bigfoot.com>

Show Full Headers
Complete Article Headers
X-Google-Language: SPANISH,ASCII
X-Google-Thread: f86c8,9a6053025ee6c2ae
X-Google-Attributes: gidf86c8,public
X-Google-ArrivalTime: 2002-12-27 18:05:53 PST
Path: arc1-ca.pugleaf.net!archiver1.google.com!news1.google.com!newsfeed.stanford.edu!news-spur1.maxwell.syr.edu!news.maxwell.syr.edu!newsfeed.icl.net!newsfeed.fjserv.net!newsfeed.freenet.de!news.tu-darmstadt.de!fu-berlin.de!uni-berlin.de!130-mad2-x45.libre.retevision.ES!not-for-mail
From: Humitsec <me@privacy.net>
Newsgroups: es.comp.os.linux.programacion
Subject: Re: Sustituir cadenas con sed
Date: Sat, 28 Dec 2002 03:05:12 +0100
Lines: 64
Message-ID: <3E0D06D8.6080604@privacy.net>
References: <pan.2002.12.28.00.23.57.689990.8042@bigfoot.com>
NNTP-Posting-Host: 130-mad2-x45.libre.retevision.es (62.83.151.130)
Mime-Version: 1.0
Content-Type: text/plain; charset=ISO-8859-1; format=flowed
Content-Transfer-Encoding: 8bit
X-Trace: fu-berlin.de 1041041152 7824042 62.83.151.130 (16 [173219])
User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.0.1) Gecko/20020918
X-Accept-Language: en-us, en