Почему моя строка меняется в этом конвейере?

Почему моя строка меняется в этом конвейере?

Я пытался передать выходной URL в openкоманду, но обнаружил несколько случаев, когда, несмотря на изменение настроек цвета grep или передачу дальнейшего вывода через другие утилиты, такие как awkили , cutя все еще получал специальные символы в выводе. Как показано ниже:

введите описание изображения здесь

Первые два раза, когда я запускаю openкоманду, мне отправляются два следующих URL-адреса:

введите описание изображения здесь введите описание изображения здесь

Вы можете видеть, как специальные символы прикрепляются к URL-адресам, несмотря на то, что они были переданы через cut или изменены настройки цвета. Это подтверждается командой od:

➜  ~  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

Следующие два вывода пытаются использовать awkдля удаления URL из, apmоднако они также вводят специальные символы, и openкоманда затем пытается открыть их как файлы. Это подтверждается с помощью 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

Решением стало использование прекрасногоsed однострочник, sed -r "s/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[m|K]//g"что успешно удаляет все специальные символы. Последняя openкоманда использует этот однострочник и успешно переходит в, https://github.com/atom/vim-modeкак и ожидалось. Это подтверждается 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

Итак, возникает несколько вопросов:

  1. Почему не работает grep --color=none?
  2. Почему мои различные другие утилиты используют специальные символы?

Я подозреваю, что это как-то связано с настройками моей оболочки. Я используюзимсгитстертема

редактировать

похоже, что настройка TERM=dumbне оказывает никакого влияния:

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

настройка NPM_CONFIG_COLOR=falseтакже, похоже, не оказывает никакого влияния:

➜  ~/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 ✓

Я думаю, это из-за подчеркивания в URL. Я изучал это подробнее вДругой вопрос

решение1

Похоже, что специальные символы вставляются 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

с e esc [ 2 4указанием конкретных линий интереса.

Это подтверждается переключением на bash и получением того же результата:

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

Спасибо @muru за совет!

Связанный контент