2010-12-20 12 views
6

Greetz amigos.Shell equivalente a preg_replace() de PHP

Estoy buscando una manera de hacer las mismas cosas que PHP preg_replace() hace (buscar texto que coincida con una expresión regular y reemplazarlo) en un script de shell.

Por lo tanto, considere el siguiente archivo.

<a href="http://example.com/">Website #1</a> 
<a href="http://example.net/">Website #2</a> 
<a href="http://example.org/">Website #3</a> 

Y quiero conseguir esto:

http://example.com/ 
http://example.net/ 
http://example.org/ 

¿Hay una manera de hacer esto? Gracias.

+0

Su texto difiere de su ejemplo. ¿Desea extraer parte (s) de sus cadenas (como en sus ejemplos) o realmente quiere reemplazarlo con algo? – plundra

+1

Además, [no analizar HTML con expresiones regulares] (http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags/1732454#1732454) (en general). – delnan

+0

Si dice: "Entonces, considere el siguiente archivo", la gente asumirá que son los datos. Haga una pregunta correcta la próxima vez. – Anders

Respuesta

9

Se puede utilizar como sed:

sed -r 's/.*href="([^"]*)".*/\1/' file 

See it

+0

¡Genial, gracias! Así que supongo que 's' es decirle a sed que use una expresión regular, pero ¿para qué sirve' \ 1/'? – seriousdev

+0

No, 's' es sustituto y' \ 1' es la primera coincidencia (¿grupo? No está seguro del término), siendo 1 el contenido del primer paréntesis. '[^"] * 'en el caso anterior. – plundra

+0

@plundra Gracias. – seriousdev

0

Mientras sed es perfectamente adecuado, que no permite más de 9 referencias hacia atrás. Perl hace:

echo "a b c d e f g h i j k l m n o p q r s t u v w x y z" | \ 
    perl -lpe 's/(\S+) (\S+) (\S+) (\S+) (\S+) (\S+) (\S+) (\S+) (\S+) (\S+) (\S+) (\S+) (\S+) (\S+) (\S+) (\S+) (\S+) (\S+) (\S+) (\S+) (\S+) (\S+) (\S+) (\S+) (\S+) (\S+)/$1;$2;$3;$4;$5;$6;$7;$8;$9;$10;$11;$12;$13;$14;$15;$16;$17;$18;$19;$20;$21;$22;$23;$24;$25;$26/g' 
a;b;c;d;e;f;g;h;i;j;k;l;m;n;o;p;q;r;s;t;u;v;w;x;y;z 

Este (muda) ejemplo muestra que es posible ir más allá de sed 's \9