我试图将输出 url 通过管道传输到open
命令中,但发现了几个实例,尽管更改了 grep 的颜色设置或通过其他实用程序(例如 or )管道进一步输出,awk
但cut
我仍然在输出中获取特殊字符。如下所示:
前两次运行open
命令时,我分别收到这两个网址:
您可以看到特殊字符被附加到网址上,尽管它们是通过管道传输的,或者更改了颜色设置。这可以通过以下命令确认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 oneliner,sed -r "s/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[m|K]//g"
成功地剥离了所有特殊字符。最后的命令使用此 oneliner并按预期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
所以这留下了一些问题:
- 为什么不工作
grep --color=none
? - 为什么我的各种其他实用程序都附加特殊字符?
我怀疑这与我的 shell 设置有关。我在用着齐姆与吉斯特主题
编辑
设置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 ✓
我认为这是因为网址中的下划线。我一直在进一步探索它另一个问题
答案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 的提示!