Creo que el *
en las expresiones regulares en la pregunta y la mayoría de las respuestas puede ser una desaceleración importante en comparación con el uso de un +
. Considere reemplazar a la primera pregunta en el
s/[\s\t]*|/|/g
los partidos *
cero o más elementos seguida de una |
, por lo tanto, todos los |
se sustituye incluso aquellos que no necesitan ser reemplazados. Cambio de la reemplace ser
s/[\s\t]+|/|/g
sólo cambiará la |
personajes que están precedidos por uno o más espacios y las pestañas.
No tengo sed disponible, pero hice un experimento con Perl. En los datos que utilicé el script con el *
tomó casi 7 veces más tiempo que el script con +
.
Los tiempos fueron consistentes en todas las carreras.Para el +
, la diferencia entre los tiempos mínimo y máximo fue del 4% del promedio y para el *
fue del 3,6%. La relación de los tiempos promedio fue de 1 :: 6.9 para +
:: *
.
detalles del experimento
probada usando un archivo de 80 MB con poco más de 180.000 casos de [st]\.
, estos son los caracteres en minúsculas y s
t
.
La prueba utilizó un archivo de comando por lotes con 30 de cada uno de estos dos comandos, alternar la estrella y más.
perl -f TestPlus.pl input.ltrar > zz.oo
perl -f TestStar.pl input.ltrar > zz.oo
Un guión está por debajo, el otro simplemente cambió el *
-+
y star
-plus
.
#! /bin/usr/perl
use strict;
use warnings;
use Time::HiRes qw(gettimeofday tv_interval);
my $t0 = [gettimeofday()];
while(<>)
{
s/[st]*\././g;
}
my $elapsed = tv_interval ($t0);
print STDERR "Elapsed star $elapsed\n";
versión de Perl utilizado:
c:\test> perl -v
This is perl 5, version 16, subversion 3 (v5.16.3) built for MSWin32-x64-multi-thread
(with 1 registered patch, see perl -V for more detail)
Copyright 1987-2012, Larry Wall
Binary build 1603 [296746] provided by ActiveState http://www.ActiveState.com
Built Mar 13 2013 13:31:10
¿Cómo estás invocando sed? ¿Está definitivamente el archivo en su disco local y no, por ejemplo, en un montaje NFS? –
Archivo en el disco local. Invoco sed con sed -f – erotsppa
Proporcione la línea de comando completa que está utilizando. Plain 'sed -f' lee de stdin y escribe en stdout, que obviamente no es lo que estás haciendo. –