Penso che lo *
nelle espressioni regolari nella domanda e nella maggior parte delle risposte possa essere un rallentamento maggiore rispetto all'utilizzo di +
. Consideriamo la prima sostituzione della questione
s/[\s\t]*|/|/g
le *
corrisponde a zero o più elementi seguiti da un |
, quindi ogni |
è sostituito anche quelli che non sono da sostituire. Cambiare la sostituzione di essere
s/[\s\t]+|/|/g
cambierà solo le |
caratteri preceduti da uno o più spazi e tabulazioni.
Non ho disponibile sed, ma ho fatto un esperimento con Perl. Sui dati che ho usato con lo script *
sono occorse circa 7 volte più lunghe rispetto allo script con +
.
I tempi erano coerenti lungo le piste.Per la +
la differenza tra i tempi minimi e massimi era del 4% della media e per il *
era del 3,6%. Il rapporto tra i tempi medi è 1: 6.9 per +
:: *
.
dettagli dell'esperimento
testato utilizzando un file di 80 MB con poco più di 180.000 occorrenze di [st]\.
, questi sono i caratteri minuscoli s
e t
.
Il test ha utilizzato un file di comando batch con 30 di ciascuno di questi due comandi, stella alternata e più.
perl -f TestPlus.pl input.ltrar > zz.oo
perl -f TestStar.pl input.ltrar > zz.oo
Uno script è al di sotto, l'altro semplicemente cambiato il *
-+
e 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";
versione Perl usato:
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
Come stai invocando sed? Il file è sicuramente sul tuo disco locale e non, ad esempio, su un supporto NFS? –
File su disco locale. Sto invocando sed con sed -f – erotsppa
Si prega di dare l'intera riga di comando che si sta utilizzando. Semplice 'sed -f' legge da stdin e scrive su stdout, che ovviamente non è quello che stai facendo. –