Portál AbcLinuxu, 17. července 2025 22:36


Dotaz: když jsou čísla na obtíž

14.3.2011 20:57 jaromir.kopravy
když jsou čísla na obtíž
Přečteno: 270×
Odpovědět | Admin
Dobrý den, potřebuji zpracovat rozsáhlou databázi číselných hodnot a textových řetězců. Proto bych to nějak rád zautomatizoval, například sedem.

Jak mohu nahradit všechna racionální čísla (desetinná část je za tečkou) v databázi (resp. textovém souboru) za, například, znak "x")?

vstup: 555.32 nejaky text 2616486 nejaky text -868451 nejaky text

vystup: x nejaky text x nejaky text x nejaky text

A ještě jeden dotaz, v databázi jsou souřadnice bodů (bohužel ne vždy jako číslice, ale jako libolná změť čehokoliv), jako příklad A[0,1] B[3,x] C[nezname_souradnice]. Šlo by nějakou posloupností klasických bash nástrojů dojít k tomuto (oznaceni zacatku a konce napriklad retezci "souradnice" a "konec")?

vystup: A[0,1] nejaky text B[3,x] nejaky text C[nezname_souradnice]

vstup: souradnice[0,1]konec nejaky text souradnice[3,x]konec nejaky text souradnice[nezname_souradnice]konec

Děkuji za všechny nápady a návrhy, jak dojít ke kýženému výsledku.
Nástroje: Začni sledovat (0) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

14.3.2011 22:07 ____ | skóre: 15 | blog: _
Rozbalit Rozbalit vše Re: když jsou čísla na obtíž
Odpovědět | | Sbalit | Link | Blokovat | Admin

Jen přispěju nějakými těmi regexy pro sed.

  1. sed s/-\{,1\}[0-9]\{1,\}\.\{,1\}[0-9]*/x/g
  2. sed s/[A-Z]\(\[[^\]]\]\)/souradnice\1konec/g

Neověřoval jsem správnost. Raději bych to vůbec ještě přepsal v AWK nebo Perl, protože je ještě nutné něco doplnit, aby se nanahrazovala čísla obsažená v textové části, pokud tam vůbec nějaká jsou, ale nechce se mi brouzdat po dokumentaci.

14.3.2011 22:26 NN
Rozbalit Rozbalit vše Re: když jsou čísla na obtíž
Odpovědět | | Sbalit | Link | Blokovat | Admin
Ten prvni:
sed 's/[+-]\?[0-9]\{1,7\}[.]\?[0-9]\{1,3\}\?/x/g'
Vsechny vyskyty retezcu /g ktere muzou zacinat + nebo - nasleduje 1 az 7 cifer dale muze byt tecka a muze nasledovat dalsich 1 az 3 cifer.

Ten druhy:
sed 's/[A-Z]\[/souradnice\[/g'
sed 's/\]/\]konec/g'
Vsechny vyskyty retezcu, ktere zacinaji velkym pismenem a otevyraci hranatou zavorkou nahrad retezcem souradnice a otevyraci zavorkou.

Vsechny vyskyty retezce, ktery obsahuje hranatou uzavyraci zavorkou nahrad uzavyraci hranatou zavorkou a retezcem lkonce.

Asi by se oboji dalo vylepsit, ale oboji funguje.. NN

14.3.2011 23:08 jaromir.kopravy
Rozbalit Rozbalit vše Re: když jsou čísla na obtíž
Děkuji za odpovědi, regulární výrazy řeší můj problém, až na jednu věc --- velká a malá písmena (akceptuje i ta malá při [A-Z]):

----------------------------------------------------------------------------------------

test: echo "A[1,2] B[3,x] C[souradnice]" | sed 's/[A-Z]\[/souradnice\[/g';

výstup: souradnice[1,2] souradnice[3,x] souradnice[souradnice]

----------------------------------------------------------------------------------------

test: echo "A[1,2] b[3,x] C[souradnice]" | sed 's/[A-Z]\[/souradnice\[/g';

výstup: souradnice[1,2] souradnice[3,x] souradnice[souradnice]

----------------------------------------------------------------------------------------

Zkoušel jsem vícero způsobů kombinace malých a velkých písmen a bash mi nedokáže rozeznat malá a velká písmena. Můžete mi, prosím, poradit, kde je problém???
14.3.2011 23:36 Ash | skóre: 53
Rozbalit Rozbalit vše Re: když jsou čísla na obtíž
Problém může vzniknout pokud vaše locales (příkaz locale) mají LC_COLLATE takové, že řazení velkých/malých písmen je (nepříklad) aAbBcC, potom A-Z zahrnuje velká i malá písmena (krom malého a).

Demo:

bash$ locale | grep LC_COLLATE
LC_COLLATE="cs_CZ.UTF-8"

bash$ echo "a[1,2] b[3,x] C[souradnice]" | sed 's/[A-Z]\[/souradnice\[/g';
a[1,2] souradnice[3,x] souradnice[souradnice]

bash$ echo "A[1,2] Z[3,x] C[souradnice]" | sed 's/[A-z]\[/souradnice\[/g';
souradnice[1,2] Z[3,x] souradnice[souradnice]
Řešení odolné proti různým řazením:
echo "A[1,2] b[3,x] C[souradnice]" | sed 's/[[:upper:]]\[/souradnice\[/g';

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.