Atom
為什麼我的字元串在這個管道中發生變化?
我試圖通過管道將輸出 url 傳遞到
open
命令中,但發現了幾個實例,儘管更改了 grep 的顏色設置或通過其他實用程序(如管道)進一步輸出,awk
或者cut
我仍然在輸出中獲得特殊字元。如下所示:我執行
open
命令的前 2 次分別發送了兩個這兩個 url:儘管通過剪切或更改顏色設置,您仍可以看到特殊字元被附加到 url 上。這可以通過以下
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"
它成功地剝離了所有特殊字元。最後的open
命令使用這個 oneliner 並成功地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 設置有關。我正在使用帶有gitster主題的zim
編輯
設置
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 ✓
我認為這是因為網址中的下劃線。我一直在另一個問題中進一步探索它
似乎特殊字元正在被
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 的提示!