Терминал не принимает некоторые введенные символы Юникода

Это достигается через канал ( | ). Есть много хороших руководств, таких как этот .

#!/bin/bash
[[ -z $1 ]] && echo 'We need input file a' && exit 1;
[[ -z $2 ]] && echo 'We need input file b' && exit 1;  

A_CSV=$1;  
B_CSV=$2;  

A_FILE="$A_CSV.tmp";  
B_FILE="$B_CSV.tmp";  

[ -f $A_FILE ]] && rm $A_FILE;
[[ -f $B_FILE ]] && rm $B_FILE;

tr -d "\r" < $A_CSV | awk '{ if(NR == 1) sub(/^\xef\xbb\xbf/,""); print }' > $A_FILE
tr -d "\r" < $B_CSV | awk '{ if(NR == 1) sub(/^\xef\xbb\xbf/,""); print }' > $B_FILE

Я бы лично создал функцию для работы с одной операцией, поскольку вы делаете одно и то же с обоими файлами. rm -f $ A_FILE $ B_FILE , на мой взгляд, тоже выглядел бы лучше.

1
18.11.2018, 08:54
1 ответ

Хорошо, по крайней мере, теперь я нашел обходной путь.

Оказывается, проблема в том, что ifonlyif и jot не распознаются xmodmap как имена ключей. Они используются в моей конфигурации.

$ xmodmap -pke | egrep "jot|ifonlyif" 
keycode  34 = ssharp U1E9E ssharp U1E9E U017F Greek_finalsmallsigma U2212 NoSymbol jot NoSymbol U017F Greek_finalsmallsigma U2212 NoSymbol jot
keycode  58 = m M m M percent Greek_mu KP_1 KP_1 ifonlyif

Если заменить их шестнадцатеричными кодами Unicode, все будет хорошо. Так что я просто сделал:

$ xmodmap -pke | sed -e 's:ifonlyif:U21D4:' -e 's:jot:U2218:' > .Xmodmap
$ xmodmap .Xmodmap
$ xmodmap -pke | egrep "keycode  (34|58)" 
keycode  34 = ssharp U1E9E ssharp U1E9E U017F Greek_finalsmallsigma U2212 NoSymbol U2218 NoSymbol U017F Greek_finalsmallsigma U2212
keycode  58 = m M m M percent Greek_mu KP_1 KP_1 U21D4

В случае, если это может быть полезно для других, я пришел к следующему: я наблюдал вывод xev при попытке ввести (ifonlyif ) и (йота) соответственно.

KeyPress event, serial 34, synthetic NO, window 0x2400001,
    root 0x9b, subw 0x0, time 170075495, (1,1), root:(552,302),
    state 0xa0, keycode 58 (keysym 0x8cd, ifonlyif), same_screen YES,
    XLookupString gives 0 bytes: 
    XmbLookupString gives 0 bytes: 
    XFilterEvent returns: False

KeyRelease event, serial 34, synthetic NO, window 0x2400001,
    root 0x9b, subw 0x0, time 170075574, (1,1), root:(552,302),
    state 0xa0, keycode 58 (keysym 0x8cd, ifonlyif), same_screen YES,
    XLookupString gives 0 bytes: 
    XFilterEvent returns: False

KeyPress event, serial 34, synthetic NO, window 0x2400001,
    root 0x9b, subw 0x0, time 170076304, (1,1), root:(552,302),
    state 0xa0, keycode 34 (keysym 0xbca, jot), same_screen YES,
    XLookupString gives 0 bytes: 
    XmbLookupString gives 0 bytes: 
    XFilterEvent returns: False

KeyRelease event, serial 34, synthetic NO, window 0x2400001,
    root 0x9b, subw 0x0, time 170076336, (1,1), root:(552,302),
    state 0xa0, keycode 34 (keysym 0xbca, jot), same_screen YES,
    XLookupString gives 0 bytes: 
    XFilterEvent returns: False

Напротив, ввод других рабочих символов (Θ, ) дает такие строки, как:

…
state 0xa0, keycode 61 (keysym 0x7c8, Greek_THETA), same_screen YES,
XLookupString gives 2 bytes: (ce 98) "Θ"

…
state 0xa0, keycode 59 (keysym 0x10021d2, U21D2), same_screen YES,
XLookupString gives 3 bytes: (e2 87 92) "⇒"

Итак, я знал, что проблема, возможно, заключалась в XLookupString. ] ничего не вернуть. Поэтому я сделал man xlookupstring и man xmodmap. Затем я исследовал таблицу xmodmap xmodmap -pke и сравнил неудачный поиск ifonlyif как с успешным поиском U21D2 как .

2
27.01.2020, 23:34

Теги

Похожие вопросы