¿Por qué mi cadena cambia en esta canalización?

¿Por qué mi cadena cambia en esta canalización?

Estaba intentando canalizar una URL de salida en el opencomando, pero encontré varios casos en los que, a pesar de cambiar la configuración de color de grep o canalizar más salida a través de otras utilidades como awko, cuttodavía obtenía caracteres especiales en la salida. Como se muestra abajo:

ingrese la descripción de la imagen aquí

Las primeras 2 veces que ejecuto el opencomando me envían dos de estas dos URL respectivamente:

ingrese la descripción de la imagen aquí ingrese la descripción de la imagen aquí

Puede ver los caracteres especiales que se agregan a las URL a pesar de haber sido cortados o cambiados la configuración de color. Esto se confirma con el odcomando:

➜  ~  apm show vim-mode | grep https | cut -d' ' -f2 | od -atx1
0000000  esc   [   4   m   h   t   t   p   s   :   /   /   g   i   t   h
           1b  5b  34  6d  68  74  74  70  73  3a  2f  2f  67  69  74  68
0000020    u   b   .   c   o   m   /   a   t   o   m   /   v   i   m   -
           75  62  2e  63  6f  6d  2f  61  74  6f  6d  2f  76  69  6d  2d
0000040    m   o   d   e esc   [   2   4   m  nl
           6d  6f  64  65  1b  5b  32  34  6d  0a

 ➜  ~  apm show vim-mode | grep --color=none https | cut -d' ' -f2 | od -atx1
 0000000  esc   [   4   m   h   t   t   p   s   :   /   /   g   i   t   h
            1b  5b  34  6d  68  74  74  70  73  3a  2f  2f  67  69  74  68
 0000020    u   b   .   c   o   m   /   a   t   o   m   /   v   i   m   -
            75  62  2e  63  6f  6d  2f  61  74  6f  6d  2f  76  69  6d  2d
 0000040    m   o   d   e esc   [   2   4   m  nl
            6d  6f  64  65  1b  5b  32  34  6d  0a
 0000052

Las siguientes dos salidas intentan usar awkpara eliminar la URL, apmsin embargo, también introducen caracteres especiales y el opencomando luego intenta abrirlos como archivos. Esto se confirma con od:

➜  ~  apm show vim-mode | awk -F' ' '/http/ {print $2}' | od -atx1
0000000  esc   [   4   m   h   t   t   p   s   :   /   /   g   i   t   h
           1b  5b  34  6d  68  74  74  70  73  3a  2f  2f  67  69  74  68
0000020    u   b   .   c   o   m   /   a   t   o   m   /   v   i   m   -
           75  62  2e  63  6f  6d  2f  61  74  6f  6d  2f  76  69  6d  2d
0000040    m   o   d   e esc   [   2   4   m  nl
           6d  6f  64  65  1b  5b  32  34  6d  0a

La solución ha sido utilizar una preciosased oneliner, sed -r "s/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[m|K]//g"que logra eliminar todos los caracteres especiales. El comando final openutiliza este oneliner y logra llegar a https://github.com/atom/vim-modelo esperado. Esto lo confirma od:

➜  ~  apm show vim-mode | awk -F' ' '/http/ {print $2}' | sed -r "s/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[m|K]//g" | od -atx1
0000000    h   t   t   p   s   :   /   /   g   i   t   h   u   b   .   c
           68  74  74  70  73  3a  2f  2f  67  69  74  68  75  62  2e  63
0000020    o   m   /   a   t   o   m   /   v   i   m   -   m   o   d   e
           6f  6d  2f  61  74  6f  6d  2f  76  69  6d  2d  6d  6f  64  65
0000040   nl
           0a
0000041

Entonces esto deja algunas preguntas:

  1. ¿Por qué no funciona grep --color=none?
  2. ¿Por qué mis otras utilidades añaden caracteres especiales?

Sospecho que tiene algo que ver con la configuración de mi shell. Estoy usandozimcon elgistertema

editar

La configuración TERM=dumbparece no tener ningún efecto:

➜  github-application master ✓ diff <(TERM=dumb apm show vim-mode | od -atx1) <(apm show vim-mode | od -atx1)
➜  github-application master ✓

La configuración NPM_CONFIG_COLOR=falsetampoco parece tener ningún efecto:

➜  ~/w/s/g/m/todo master ✓ diff <(NPM_CONFIG_COLOR=false apm show vim-mode | od -atx1) <(apm show vim-mode | od -atx1)
➜  ~/w/s/g/m/todo master ✓

Creo que es por el subrayado en la URL. Lo he estado explorando más a fondo enotra pregunta

Respuesta1

Parece que los caracteres especiales están siendo insertados por apm.

➜  ~  apm show vim-mode | grep https | cut -d' ' -f2 | od -atx1
0000000  esc   [   4   m   h   t   t   p   s   :   /   /   g   i   t   h
           1b  5b  34  6d  68  74  74  70  73  3a  2f  2f  67  69  74  68
0000020    u   b   .   c   o   m   /   a   t   o   m   /   v   i   m   -
           75  62  2e  63  6f  6d  2f  61  74  6f  6d  2f  76  69  6d  2d
0000040    m   o   d   e esc   [   2   4   m  nl
           6d  6f  64  65  1b  5b  32  34  6d  0a

 ➜  ~  apm show vim-mode | grep --color=none https | cut -d' ' -f2 | od -atx1
 0000000  esc   [   4   m   h   t   t   p   s   :   /   /   g   i   t   h
            1b  5b  34  6d  68  74  74  70  73  3a  2f  2f  67  69  74  68
 0000020    u   b   .   c   o   m   /   a   t   o   m   /   v   i   m   -
            75  62  2e  63  6f  6d  2f  61  74  6f  6d  2f  76  69  6d  2d
 0000040    m   o   d   e esc   [   2   4   m  nl
            6d  6f  64  65  1b  5b  32  34  6d  0a
 0000052

➜  ~  apm show vim-mode | od -atx1
0000000  esc   [   3   6   m   v   i   m   -   m   o   d   e esc   [   3
           1b  5b  33  36  6d  76  69  6d  2d  6d  6f  64  65  1b  5b  33
0000020    9   m  nl   �  94  9c   �  94  80   �  94  80  sp esc   [   3
           39  6d  0a  e2  94  9c  e2  94  80  e2  94  80  20  1b  5b  33
0000040    3   m   0   .   6   5   .   1 esc   [   3   9   m  nl   �  94
           33  6d  30  2e  36  35  2e  31  1b  5b  33  39  6d  0a  e2  94
0000060   9c   �  94  80   �  94  80  sp esc   [   4   m   h   t   t   p
           9c  e2  94  80  e2  94  80  20  1b  5b  34  6d  68  74  74  70
0000100    s   :   /   /   g   i   t   h   u   b   .   c   o   m   /   a
           73  3a  2f  2f  67  69  74  68  75  62  2e  63  6f  6d  2f  61
0000120    t   o   m   /   v   i   m   -   m   o   d   e esc   [   2   4
           74  6f  6d  2f  76  69  6d  2d  6d  6f  64  65  1b  5b  32  34
0000140    m  nl   �  94  9c   �  94  80   �  94  80  sp   A   d   d  sp
           6d  0a  e2  94  9c  e2  94  80  e2  94  80  20  41  64  64  20
0000160    v   i   m  sp   m   o   d   a   l  sp   c   o   n   t   r   o
           76  69  6d  20  6d  6f  64  61  6c  20  63  6f  6e  74  72  6f
0000200    l  nl   �  94  9c   �  94  80   �  94  80  sp   5   0   3   8
           6c  0a  e2  94  9c  e2  94  80  e2  94  80  20  35  30  33  38
0000220    6   1  sp   d   o   w   n   l   o   a   d   s  nl   �  94  94
           36  31  20  64  6f  77  6e  6c  6f  61  64  73  0a  e2  94  94
0000240    �  94  80   �  94  80  sp   1   0   1   4  sp   s   t   a   r
           e2  94  80  e2  94  80  20  31  30  31  34  20  73  74  61  72
0000260    s  nl  nl   R   u   n  sp   `   a   p   m  sp   i   n   s   t
           73  0a  0a  52  75  6e  20  60  61  70  6d  20  69  6e  73  74
0000300    a   l   l  sp   v   i   m   -   m   o   d   e   `  sp   t   o
           61  6c  6c  20  76  69  6d  2d  6d  6f  64  65  60  20  74  6f
0000320   sp   i   n   s   t   a   l   l  sp   t   h   i   s  sp   p   a
           20  69  6e  73  74  61  6c  6c  20  74  68  69  73  20  70  61
0000340    c   k   a   g   e   .  nl  nl
           63  6b  61  67  65  2e  0a  0a
0000350

siendo e esc [ 2 4las líneas de interés específicas.

Esto se confirma cambiando a bash y obteniendo el mismo resultado:

bash-3.2# apm show vim-mode | grep https | cut -d' ' -f2 | od -atx1
0000000  esc   [   4   m   h   t   t   p   s   :   /   /   g   i   t   h
           1b  5b  34  6d  68  74  74  70  73  3a  2f  2f  67  69  74  68
0000020    u   b   .   c   o   m   /   a   t   o   m   /   v   i   m   -
           75  62  2e  63  6f  6d  2f  61  74  6f  6d  2f  76  69  6d  2d
0000040    m   o   d   e esc   [   2   4   m  nl
           6d  6f  64  65  1b  5b  32  34  6d  0a

¡Gracias @muru por el consejo!

información relacionada