Mapování znaků v bashi

Mapování znaků v bashi
« kdy: 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.


z_sk

Re:Mapování znaků v bashi
« Odpověď #1 kdy: 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ť.

Re:Mapování znaků v bashi
« Odpověď #2 kdy: 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.

z_sk

Re:Mapování znaků v bashi
« Odpověď #3 kdy: 03. 07. 2023, 01:06:33 »
  • Čo robíš?
  • Prečo si to sám nenaprogramuješ ale snažíš sa použiť AI?
  • Robíš detekciu znakov a napríklad nejaké nahradzovanie? Nie je vhodnejšie použiť knižnicu libintl (napr. funkcia IntlChar::isblank() viď https://www.php.net/manual/en/intlchar.isblank.php)?

Re:Mapování znaků v bashi
« Odpověď #4 kdy: 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 :-)


Kit

  • *****
  • 704
    • Zobrazit profil
    • E-mail
Re:Mapování znaků v bashi
« Odpověď #5 kdy: 03. 07. 2023, 11:36:59 »
K čemu to má sloužit? Nestačilo by použít iconv nebo recode?

Re:Mapování znaků v bashi
« Odpověď #6 kdy: 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

Re:Mapování znaků v bashi
« Odpověď #7 kdy: 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"

Re:Mapování znaků v bashi
« Odpověď #8 kdy: 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)

mikrom

  • ****
  • 344
    • Zobrazit profil
    • E-mail
Re:Mapování znaků v bashi
« Odpověď #9 kdy: 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'

Re:Mapování znaků v bashi
« Odpověď #10 kdy: 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.



Kit

  • *****
  • 704
    • Zobrazit profil
    • E-mail
Re:Mapování znaků v bashi
« Odpověď #11 kdy: 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?

Re:Mapování znaků v bashi
« Odpověď #12 kdy: 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.

z_sk

Re:Mapování znaků v bashi
« Odpověď #13 kdy: 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