Portál AbcLinuxu, 10. května 2025 22:48

Dotaz: Jak na kontrolu znaků

24.2.2013 18:31 Martin
Jak na kontrolu znaků
Přečteno: 312×
Odpovědět | Admin
Dobrý večer, nemá někdo bash podmínku-script který dokáže zjistit, jestli daný řetězec obsahuje pouze znaky malé znaky bez diakritiky a čísla? Nesmí obsahovat háčky, čárky, velké znaky, mezery, tečky, limítka, podtržítka, pomlčky prostě nic, jen abcdefghijklmnoprstvwxyz0123456789 Může někdo znalý pomoci? Děkuji Martin
Nástroje: Začni sledovat (0) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

24.2.2013 18:35 chrono
Rozbalit Rozbalit vše Re: Jak na kontrolu znaků
Odpovědět | | Sbalit | Link | Blokovat | Admin
if [[ "retazec" =~ ^[a-z0-9]*$ ]]
then
    echo "retazec je OK"
fi
24.2.2013 20:51 potato
Rozbalit Rozbalit vše Re: Jak na kontrolu znaků
if [[ "retazec" =~ '^[a-z0-9]*$' ]]
paranoi není nikdy dost.
24.2.2013 22:18 rubicon
Rozbalit Rozbalit vše Re: Jak na kontrolu znaků
Což o to, zdravá opatrnost není na škodu, ale v tomhle případě radíte špatně.

"Any part of the pattern may be quoted to force it to be matched as a string."

Pokud $retazec neobsahuje identickou posloupnost znaků mezi uvozovkami, bude návratová hodnota 1, což tazatel zajisté nechtěl.
24.2.2013 22:52 potato
Rozbalit Rozbalit vše Re: Jak na kontrolu znaků
Mea culpa, [[ ... ]] je svérázná konstrukce, uvnitř níž neprobíhají některé expanze. Navíc neexistuje způsob, jak zapsat totéž pomocí test, takže jsme se opět syntakticky přiblížili perlu :(
25.2.2013 08:09 Michal Kubeček | skóre: 72 | Luštěnice
Rozbalit Rozbalit vše Re: Jak na kontrolu znaků
Navíc neexistuje způsob, jak zapsat totéž pomocí test, takže jsme se opět syntakticky přiblížili perlu :(

Jste si jistý, že neexistuje? Co třeba

  if [ -z "${str//[[:alnum:]]}" ]; then
      ...
  fi

Mimochodem, "[0-9a-z]" u mne v locale cs_CZ.UTF-8 zahrnuje všechna malá i velká písmena kromě ž, Z a Ž. Pochybuji, že to je to, co měl tazatel na mysli.

25.2.2013 09:22 chrono
Rozbalit Rozbalit vše Re: Jak na kontrolu znaků
[[:alnum:]] zase zahŕňa aj veľké písmená. :) (takže správna kombinácia bude [[:lower:][:digit:]] )
25.2.2013 09:24 Michal Kubeček | skóre: 72 | Luštěnice
Rozbalit Rozbalit vše Re: Jak na kontrolu znaků
Jak je zmíněno v příspěvku, na který odpovídáte, [a-z] také - tedy aspoň většinu z nich.
25.2.2013 15:03 Ash | skóre: 53
Rozbalit Rozbalit vše Re: Jak na kontrolu znaků
Správná kombinace to nebude, protože malá písmena s nabodeníčky nejsou o nic menší, než malá písmena bez nich, takže [:lower:] zahrnuje i ty háčkované a čárkované, kroužkované nevyjímaje, a to jsem zatím jen u češtiny či slovenčtiny, takže si ještě račme přenastaviti locale :-)
25.2.2013 20:11 potato
Rozbalit Rozbalit vše Re: Jak na kontrolu znaků
Myslel jsem test na regulární výraz obecně, který je v bashi možný pouze pomocí [[ ... ]].

Lokalizace je samozřejmě při skriptování mor, protože příkazy mají zřídka jasnou hranici mezi výstupem pro člověka a výstupem pro další zpracování, a jediná pomoc je automaticky export LC_ALL=C v každém skiptu, který čte výstup čehokoli nebo pracuje se znaky.
25.2.2013 14:56 Ash | skóre: 53
Rozbalit Rozbalit vše Re: Jak na kontrolu znaků
Ono je vůbec otázka proč to psát pomocí test, když stačí grep.
if grep -q "^[[:lower:][:digit:]]*$" <<<"123abc"; then
  echo "ok..."
fi
A v tom [[ ]] nemusíte dávat do uvozovek ani ten $retezec, když jsme u toho, takže ano, při porovnávání s test lze očekávat spíš odlišnosti než podobnosti.
25.2.2013 15:33 Michal Kubeček | skóre: 72 | Luštěnice
Rozbalit Rozbalit vše Re: Jak na kontrolu znaků
Ono je vůbec otázka proč to psát pomocí test, když stačí grep

Příkaz test je v bashi builtin, grep ne. Tedy aspoň zatím ne. :-)

25.2.2013 15:07 Ash | skóre: 53
Rozbalit Rozbalit vše Re: Jak na kontrolu znaků
Odpovědět | | Sbalit | Link | Blokovat | Admin
retezec="abcdefghijklmnoprstvwxyz0123456789"

LC_ALL=C

if [[ $retazec =~ ^[[:lower:][:digit:]]*$ ]]
then
    echo "retazec je OK"
fi
a případně vrátit locale zpět.

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.