Не-ascii-символы больше не отображаются в bash

С помощью GAWK 4 вы можете сохранить разделители полей, явно разделив строку (или всю строку) и перебирая результат разделения (поля и разделители) для вывода.

В этом примере используются FPAT (регулярное выражение, определяющее структуру поля) и patsplit () , но можно использовать FS (регулярное выражение, определяющее разделитель полей или содержащее один пробел для представления [\ t \ n] + ) и split () вместо этого.

gawk "v=$value" '{n = patsplit($0, arr, FPAT, seps); arr[11] = v; for (i = 0; i <= n; i++) {printf "%s%s", a[i], seps[i]}; print ""}'

Обратите внимание, что a [0] всегда будет нулевым, seps [0] будет содержать любой начальный разделитель, а seps [n] будет любым разделителем символы (пробелы) в конце строки ввода. '

Вот единственная строка в более удобочитаемой форме:

gawk "v=$value" '
    {
        n = patsplit($0, arr, FPAT, seps); 
        arr[11] = v; 
        for (i = 0; i <= n; i++) {
            printf "%s%s", a[i], seps[i]
        }; 
        print ""
    }'
2
17.06.2018, 20:40
2 ответа

Diría que lo más probable es que su terminal esté mal configurado y envíe y muestre caracteres en algún conjunto de caracteres de un solo byte -, probablemente ISO8859 -1 o ISO8859 -15 dados los caracteres de muestra que muestra en lugar de los de la configuración regional juego de caracteres.

Por lo general, no hay ningún carácter ø, å, æen la configuración regional C y la codificación ISO8859 -1 (5 )de esos caracteres (0xf8, 0xe5, 0xe6 )no forman caracteres válidos en UTF -8. Los editores de línea como readline o zle necesitan decodificarlos en caracteres, ya que necesitan saber cuántos bytes componen una columna de visualización para poder posicionar el cursor correctamente.

Además, en la configuración regional C que en la mayoría de los sistemas usa ASCII, dado que no hay caracteres en ASCII con el bit 8 establecido, ese bit 8 se entendería por bashcomo significado Meta . 0xF8 se entendería como Meta+x(0x78 (x )| 0x80 ),porque eso es lo que envían algunos terminales Alt+x o Meta+x .

Mientras que M -x no está vinculado a nada por defecto en bash, ßse entendería como M -_e insertaría la última palabra. Puedes apagar eso con:

bind 'set convert-meta off'

Shells como cshson ​​demasiado antiguos como para darse cuenta de que los caracteres pueden estar hechos de varios bytes o ocupar cualquier cosa menos el ancho de una sola columna, por lo que no molestan.

Para verificar esa teoría, ejecute:

od -An -vtx1

E ingrese esos caracteres seguidos de ^D^Dy vea qué codificación ve. Si ve 0xf8 para ø, eso significa que tengo razón. Si ve 0xc3 0xb8 en su lugar, que es la codificación UTF -8 de ø, eso significa que estoy equivocado.

O cambie la configuración regional ada_DK.iso88591(compruebe en locale -ael nombre exacto de la configuración regional en su sistema )y vea si eso funciona mejor.

Ahora, en cuanto a por qué su terminal puede enviar la codificación incorrecta para esos caracteres, tal vez se inició en una configuración regional donde el conjunto de caracteres era iso8859 -1. Tal vez está configurado para ignorar la configuración regional y usar un conjunto de caracteres específico (busque juego de caracteres o codificación en su configuración ). O tal vez haya ingresado sshdesde otro sistema en el que la configuración regional usaba ISO8859 -1 (5 )como conjunto de caracteres.

Puedo reproducir ese comportamiento si desde una terminal UTF -8, ejecuto:

LC_ALL=en_GB.iso885915 luit

Y desde luitcambie la configuración regional a Co una UTF -8 e ingrese caracteres que no sean -ASCII.

4
27.01.2020, 22:02

Su prueba catindica que la conexión del terminal está limpia en 8 -bits. Así que parece un posible problema de configuración regional.

Ejecute locale -apara verificar que la configuración regional elegida "da _DK.utf8" existe; si no está en la lista y está en un sistema que pertenece a la familia Debian/Ubuntu, es posible que deba descomentarlo en /etc/locale.geny luego ejecutar locale-gencomo root.

Además, algunas versiones de shell no pueden cambiar de configuración regional dinámicamente, pero siguen usando la configuración de configuración regional que se heredó originalmente de su proceso principal . Si este es el caso, ejecutar LC_CTYPE=da_DK.UTF-8 bashrestauraría el comportamiento deseado, solo durante el tiempo de esa sesión en particular. Si eso es cierto, entonces cambiar la configuración regional predeterminada del sistema a cualquier configuración regional compatible con UTF -8 y luego reiniciar podría ayudar :cambiaría la configuración regional de los procesos responsables de manejar su inicio de sesión e iniciar su shell.

0
27.01.2020, 22:02

Теги

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