Portál AbcLinuxu, 5. listopadu 2025 13:05
sed 's/\([0-9][0-9][0-9]\)$/ \1/g'ale to mi udělá pouze do tisíců.. Nelze nějak nastavit, aby se příkaz (například
's/\([0-9][0-9][0-9] \)$/ \1/g') opakoval, dokud neudělá už žádnou další změnu? Se sedem pracuji asi celé dvě hodiny, takže se moc nevyznám... Za každé nakupnutí moc díky!
echo 1234567890 \
| rev \
| sed -re 's/([0-9]{3})/\1 /g' -e 's/ $//' \
| rev
:-) Ale určitě to jde nějak inteligentněji…
a=1234567890
while true; do
b=`echo "$a" | sed -re 's/([0-9])([0-9]{3})\>/\1 \2/'`
if [ "$b" = "$a" ]; then break; fi
a="$b"
done
echo "$a"
:-)
sed -re ':1; s/([0-9])([0-9]{3})\>/\1 \2/; t1'
perl -pe 's/(?<=\d)(?=(\d{3})+\D)/ /g;'Pro srovnání ekvivalent toho sedového řešení, tedy aplikace regexpu na jedn řádek dokud se něco matchne, ale s využitím look-ahead/behid (many)
perl -pe 'while(s/(?<=\d)(?=\d{3}\D)/ /){}'a nakonec úplný ekvivalent toho sedu (normal)
perl -pe 'while(s/(\d)(\d{3}\D)/$1 $2/){}'A srovnání rychlostiRate one many normal one 69367/s -- -10% -47% many 77244/s 11% -- -40% normal 129705/s 87% 68% --Což mě teda přinejmenším hodně překvapilo, že to úplně obyčejné řešení je zároveň nejrychlejší.
Benchmark modul v perlu nad třemi řetězci načtenými z DATA. Musel bych nějak vymyslet jak omezit vliv natahování sed a rev do paměti a nad tím se mi teď nechce přemýšlet. Jinak zdroják testu:#!/usr/bin/env perl
use strict;
use warnings;
use Benchmark qw(cmpthese);
my @strs = <DATA>;
cmpthese(-2, {
one => sub {
foreach (@strs) {
s/(?<=\d)(?=(\d{3})+\D)/ /go;
}
},
many => sub {
foreach (@strs) {
while (s/(?<=\d)(?=\d{3}\D)/ /o){}
}
},
normal => sub {
foreach (@strs) {
while (s/(\d)(\d{3}\D)/$1 $2/o){}
}
}
});
__DATA__
1234567890
hwiehwfuih
1246537245735
__END__
strfmon(), něco jako je printf(1) vůči printf(3).
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.