Fórum Root.cz

Hlavní témata => Vývoj => Téma založeno: exkalibr 02. 07. 2023, 20:02:29

Název: Mapování znaků v bashi
Přispěvatel: exkalibr 02. 07. 2023, 20:02:29
Chtěl jsem v bashi napsat mapování, abych mohl převést znaky v řetězci UTF8. Nedařilo se mi vytvořit to potřebné pole pokud jsou zahrnuty nějaké speciální znaky jako  "׃" , "   ֯" .

  local replacements=(
['\u05C3 ']=' '
['\u05AF ']=' '
)

Když spustím takový skript v bashi vždy dostanu hlášku syntaktická chyba: očekáván operand (chybný token ... a zobrazí se znak či hodnota, která je na posledním elementu).

Zjistil jsem sice že to jde udělat pomocí regulárních výrazů, ale problém v tom případě je, že by to bylo značně pomalé na výkon. Klasická náhrada znaků pomocí mapování by myslím měla být výrazně výkonnější.

Pracuji na mint20. Dá se tento problém nějak obejít nebo je to v bashi neřešitelné a musím použít python, perl? Já už si na bash začínám zvykat a učit si jiný jazyk, kterému vůbec nerozumím se mi moc nechce.
Název: Re:Mapování znaků v bashi
Přispěvatel: z_sk 02. 07. 2023, 22:04:15
Vyzera, že bash ma asi obmedzene key na 'a'-'z' a(elebo) 'A'-'Z'. Takže ukladaj v tom asociovanom poli to key ako hexa string alebo base64. Pozor base64 môže končiť na =, takže to = treba ináč zakódovať.
Název: Re:Mapování znaků v bashi
Přispěvatel: exkalibr 03. 07. 2023, 00:47:08
díky, ty \x sekvence fungují ale nemohu chatGPT přimět aby to správně převedl. Nedokáže převést 110 klíčů a hodnot a vygeneruje kratší seznam.
Název: Re:Mapování znaků v bashi
Přispěvatel: z_sk 03. 07. 2023, 01:06:33
Název: Re:Mapování znaků v bashi
Přispěvatel: snugar_i 03. 07. 2023, 07:36:36
Dá se tento problém nějak obejít nebo je to v bashi neřešitelné a musím použít python, perl? Já už si na bash začínám zvykat a učit si jiný jazyk, kterému vůbec nerozumím se mi moc nechce.
Většina věcí se dá obejít. Otázka je, jestli to z to stojí. I podle tvých minulých příspěvků se mí zdá, že se snažíš dělat věci, který jsou pro bash už tak trochu na hraně. Naučit se aspoň základy třeba pythonu by sice chvilku trvalo, ale pokud se skriptování chceš věnovat déle než v řádu řekněme týdnů, tak se to do budoucna určitě vyplatí. Opisovat bordel z ChatGPT do pythonu by nemělo být o moc jiný než ho opisovat do bashe :-)
Název: Re:Mapování znaků v bashi
Přispěvatel: Kit 03. 07. 2023, 11:36:59
K čemu to má sloužit? Nestačilo by použít iconv nebo recode?
Název: Re:Mapování znaků v bashi
Přispěvatel: exkalibr 03. 07. 2023, 11:52:06
Možná to nebylo tak, že by to nešlo zapsat ty sekvence do asoc. pole, ale že tato funkce to hlásí tu chybu. A AI včera hlásilo, že to v tom nejde udělat, protože jsem mu položil otázku jestli v tom počítá s vícebajtovými znaky v unicode a on řekl, že ne, že jede po jednom bytu.

Kód: [Vybrat]
  local input=$1
  local output=""
  local length=${#input}

  for (( i = 0; i < length; i++ )); do
    local char=${input:i:1}
    local replacement=${replacements[$char]}
    output+="${replacement:-$char}"
  done

Na ten iconv bych mohl mrknout
Název: Re:Mapování znaků v bashi
Přispěvatel: exkalibr 03. 07. 2023, 16:33:24
Omlouvám se ale ten AI nedokáže spolehlivě vygenerovat ani ten kod pro iconv. A já nechápu jak to použít. Furt to nejde rozjet. Nevím jestli jsem správně pochopil ten mapovací soubor. Z toho co jsem se od AI dozvěděl je že při použití přepínače -t se má automaticky používat jako oddělovač dvojtečka ":" ale to nevím jestli si nevymýšlí. V man jsem to nenašel.

AI jsem poslal dokumentaci manpages a z toho vygeneroval syntaxy:

Kód: [Vybrat]
iconv -f <původní-kódování> -t UTF-8 <vstupní-soubor> -o <výstupní-soubor>

Nicméně mě to nepřevádí ten původní text na jiné znaky. Některé znaky jsem chtěl odstranit, ale AI řekl, že to iconv neumí. Tak jsem je převedl na takovou "tečku", kterou bych pak mohl odstranit. Ale když se má zobrazit výsledný zkušební text, což je jen pár slov, tak se něco vypíše na mnoho řádků.. Neočekávané chování a nejsou tam ty základní znaky, které měly zůstat

Je toto takto správně?
Kód: [Vybrat]
output=$(echo "$input" | iconv -f UTF-8 -t UTF-8//TRANSLIT -c "$map_file")
echo "$output"
Název: Re:Mapování znaků v bashi
Přispěvatel: snugar_i 03. 07. 2023, 17:04:00
Chápu, že konstruktivní rady spíše ignorujete a jedete si tady pořád to svoje o copy-pastování AI kódu, kterému nerozumíte, ale v pythonu by to fakt nebyla žádná raketová věda:

replacements = {
    'á': 'a',
    'č': 'c',
    'ř': 'r',
}

def funkce(input):
    output = ''
    for char in input:
        replacement = replacements.get(char) or char
        output += replacement
    return output

print(funkce('břicháč'))


(Nebo teda méně čitelná, ale kratší verze té funkce)

def funkce(input):
    return ''.join(replacements.get(char, char) for char in input)
Název: Re:Mapování znaků v bashi
Přispěvatel: mikrom 03. 07. 2023, 18:00:26
Chápu, že konstruktivní rady spíše ignorujete a jedete si tady pořád to svoje o copy-pastování AI kódu, kterému nerozumíte, ale v pythonu by to fakt nebyla žádná raketová věda:

replacements = {
    'á': 'a',
    'č': 'c',
    'ř': 'r',
}

def funkce(input):
    output = ''
    for char in input:
        replacement = replacements.get(char) or char
        output += replacement
    return output

print(funkce('břicháč'))


(Nebo teda méně čitelná, ale kratší verze té funkce)

def funkce(input):
    return ''.join(replacements.get(char, char) for char in input)


alebo pouzit string.translate()
Kód: [Vybrat]
>>> str = "břicháč"
>>> str
'břicháč'
>>> replacements = str.maketrans("áčř", "acr")
>>> replacements
{225: 97, 269: 99, 345: 114}
>>> str_translated = str.translate(replacements)
>>> str_translated
'brichac'
Název: Re:Mapování znaků v bashi
Přispěvatel: synuhed 03. 07. 2023, 23:07:09
priznam se, ze mi zcela unika smysl. Z jakych locales na jake? UTF je zezdola nahoru kompatibilni a navic je to dnes defaultni kodovani.

Konvertovat UTF8 na ASCII , CP437 apod neni mozne, proste nejde vsechny znaky UTF prevest na klasicky 1 byte, ale jde  pouzit //TRANSLIT  v iconv napr.


Název: Re:Mapování znaků v bashi
Přispěvatel: Kit 03. 07. 2023, 23:58:56
Pořád ještě nevíme, k čemu to vlastně má sloužit. Třeba je to dávno vymyšleno a dělá to kompletně celou práci. Jaký má smysl vyhazovat nějaké znaky a proč jen ty dva zmíněné? Co třeba použít příkaz tr?
Název: Re:Mapování znaků v bashi
Přispěvatel: exkalibr 04. 07. 2023, 23:57:53
možná by to šlo v tom tr. Ale už to dělám v regexech a sedu. Počítám s tím, že když to napíšu v sedu, mohu v budoucnu porovnat výkon abych zjistil co je lepší jestli sed nebo regex. Ale co jsem potřeboval v podstatě už mám.

Teď řeším ještě úplně jiný problém, ten se netýká programování, ale zobrazení kódu. Otevírám js soubor na internetu a nezobrazuje se mi tam utf-8 kodování, ačkoliv to je psané v utf-8. Kvůli tomu, když chci zkopírovat znaky, nezobrazují se správně. Firefox to asi vidí jako Windows-1250. Tedy když to zkopíruju do subl nebo do xedu, mám tam nesprávné znaky. A nevím jak to dát zpět. Druhá možnost co mohu zkusit je zkopírovat to v PSPadu, kde se to zobrazuje správně a vložit to do linuxu ve správném kódování.  Ale tohle neřeší můj problém do budoucna. Prostě nevím jak v FF zobrazit ty správné znaky a v xedu a sublu mi to taky nejde.
Název: Re:Mapování znaků v bashi
Přispěvatel: z_sk 05. 07. 2023, 15:04:24
Teď řeším ještě úplně jiný problém, ten se netýká programování, ale zobrazení kódu. Otevírám js soubor na internetu a nezobrazuje se mi tam utf-8 kodování, ačkoliv to je psané v utf-8. Kvůli tomu, když chci zkopírovat znaky, nezobrazují se správně. Firefox to asi vidí jako Windows-1250. Tedy když to zkopíruju do subl nebo do xedu, mám tam nesprávné znaky. A nevím jak to dát zpět. Druhá možnost co mohu zkusit je zkopírovat to v PSPadu, kde se to zobrazuje správně a vložit to do linuxu ve správném kódování.  Ale tohle neřeší můj problém do budoucna. Prostě nevím jak v FF zobrazit ty správné znaky a v xedu a sublu mi to taky nejde.
https://support.mozilla.org/en-US/kb/text-encoding-no-longer-available-firefox-menu