Portál AbcLinuxu, 17. července 2025 07:33
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í rychlosti
Rate 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.