Article View: es.comp.os.linux.programacion
Article #8195Re: Sustituir cadenas con sed
From: Humitsec
Date: Sat, 28 Dec 2002 02:05
Date: Sat, 28 Dec 2002 02:05
63 lines
4184 bytes
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-mailReferences:
<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