Prosíme přihlašte se nebo zaregistrujte.

Přihlašte se svým uživatelským jménem a heslem.
Vaše pomoc je stále potřeba!

Autor Téma: Regulární výraz [VYŘEŠENO]  (Přečteno 1823 krát)

ramael

  • Aktivní člen
  • *
  • Příspěvků: 366
Regulární výraz [VYŘEŠENO]
« kdy: 12 Července 2022, 18:49:10 »
Zdravím. Nejdříve skript který "zazlobil":
Kód: [Vybrat]
#! /usr/bin/env bash

# Ukončovací funkce s chybovou hláškou.
konec (){
  echo "only numbers in range from 0 to $max_bright" >&2
  exit 1
}

# Adresa složky s hodnotama backlightu
slozka=/sys/class/backlight/amdgpu_bl0
# Soubor s podsvětlením
backlight_adr="$slozka/brightness"
# Maximální povolená hodnota podsvětlení
max_bright=$(cat $slozka/max_brightness)

# Načtení argumentu
[ "$1" ] && { aktual=$1; } || aktual=$(xargs $1)

# Test na argument hodnoty integer
# Regulární výraz na test čísla minimálně jedno a  maximálně tříciferné
! [[ $aktual =~ ^[0-9]{1,3}$ ]] && konec

# Test na mezní hodnoty
[ $aktual -le $max_bright ] && [ $aktual -ge 0 ] && { echo $aktual > $backlight_adr &2>/dev/null ; } || konec
# echo $aktual
Tento skriptík nastavuje podsvětlení displeje na mém ntb. Předám mu jak chci aby mne to svítilo do očí. Skript zkontroluje jestli je hodnota v pořádku a nastaví ji. Avšak díky chybné konfiguraci mé klávesnice jsem dnes narazil na zajímavou věc. Regulární výraz
Kód: [Vybrat]
^[0-9]{1,3}$ propustil i znaky které neměl. Vyřešil jsem to přepsáním na
Kód: [Vybrat]
^[0123456789]{1,3}$konkrétně se jednalo o znak ¹ a nejspíš o znak down
Nemohu však nějak pobrat proč to tak je. Měl jsem za to, že [0-9] je to samé jako [0123456789]
Dohledal jsem že někteří lidé doporučují delší zápis kvůli míchání znaků s jejich národními znaky. Avšak proč se tak děje?
« Poslední změna: 12 Července 2022, 19:27:25 od ramael »
Lenovo: Ideapad 5, AMD Ryzen 4000 
MeWe  Joutůůůůb

ramael

  • Aktivní člen
  • *
  • Příspěvků: 366
Re:Regulární výraz
« Odpověď #1 kdy: 12 Července 2022, 19:26:43 »
Mno. Kus dne se v tom šťourám, pak se zeptám. A chvíli na to najdu odpověď.
Tak kdyby náhodou někdo na podobnou věc narazil.
[0-9] je to samé jako posixové [:digit:] a to obsahuje i jiné "číslicové" znaky než 0 až 9
Zdroj:  https://www.regular-expressions.info/posixbrackets.html
Jinak řečeno [0123456789] je podmnožina [0-9]

EDIT:
Tak to také není pravda. Minimálně u mě s bash verzí 5.0.17(1)-release:
Kód: [Vybrat]
retezec="0123456789⁰¹²³⁴⁵⁶⁷⁸⁹₀₁₂₃₄₅₆₇₈₉"
echo $retezec | sed s/[[:digit:]]/" "/g
          ⁰¹²³⁴⁵⁶⁷⁸⁹₀₁₂₃₄₅₆₇₈₉
echo $retezec | sed s/[0-9]/" "/g
                   ⁹         ₉
echo $retezec | sed s/[0123456789]/" "/g
          ⁰¹²³⁴⁵⁶⁷⁸⁹₀₁₂₃₄₅₆₇₈₉

EDIT2:
Na základě správné připomínky @GdH, jsem poopravil příklady aby byly příkladnější  :)
Kód: [Vybrat]
radek@laptop:~/screenshots$ echo $retezec | sed 's/[[:digit:]]/X/g'
XXXXXXXXXX⁰¹²³⁴⁵⁶⁷⁸⁹₀₁₂₃₄₅₆₇₈₉
radek@laptop:~/screenshots$ echo $retezec | sed 's/[0-9]/X/g'
XXXXXXXXXXXXXXXXXXX⁹XXXXXXXXX₉
radek@laptop:~/screenshots$ echo $retezec | sed 's/[0123456789]/X/g'
XXXXXXXXXX⁰¹²³⁴⁵⁶⁷⁸⁹₀₁₂₃₄₅₆₇₈₉
Kde znak X nahradí co projde filtrem.
« Poslední změna: 13 Července 2022, 16:06:39 od ramael »
Lenovo: Ideapad 5, AMD Ryzen 4000 
MeWe  Joutůůůůb

GdH

  • Moderátor
  • Závislák
  • ***
  • Příspěvků: 3171
    • GdH-Notes
Re:Regulární výraz [VYŘEŠENO]
« Odpověď #2 kdy: 13 Července 2022, 15:32:28 »
Jó, je to bordel, člověk si na to musí dát pozor.
https://unix.stackexchange.com/a/414230/533294

Mimochodem, když píšeš příkazy/výrazy pro sed, awk, grep, tak je bezpečnější psát je celé do jednoduchých uvozovek, abys pak nebyl překvapen výsledky, až ti shell něco přepíše (expanduje). Ty to určitě víš, ale pokud to sleduje někdo méně zkušený, může na to pak koukat jak husa do flašky, když začne něco vymýšlet sám a ono se to chová jinak, než očekává. A psát cokoli delšího v shellu je vždycky extrémně náročné na pozornost.

 

Provoz zaštiťuje spolek OpenAlt.