Zsh
使用 ANSI 轉義碼對字元串進行排序
我正在嘗試列印所有 zsh 選項的排序列表,設置選項為綠色,未設置選項為紅色。我無法
sort
在彩色線上正常工作。下面列印所有紅色選項,然後是所有綠色選項:print -lP "%F{green}"${^$(setopt)} "%F{red}"${^$(unsetopt)} | sort
我認為這是因為
print -P
正在擴展格式字元串,使得每個選項行都以^[[31m
紅色和^[[32m
綠色開頭。查看sort
手冊頁,我看到了兩個可能有幫助的選項:-i, –ignore-nonprinting 只考慮可列印字元
-k, –key=POS1
$$ ,POS2 $$ 在 POS1(原點 1)開始一個鍵,在 POS2 結束它(預設行尾)
所以我嘗試了:
print -lP "%F{green}"${^$(setopt)} "%F{red}"${^$(unsetopt)} | sort -i
和
print -lP "%F{green}"${^$(setopt)} "%F{red}"${^$(unsetopt)} | sort --key=<N>
我嘗試設置
<N>
許多不同的數字。在所有情況下,我都得到了相同的結果(所有紅色選項都在綠色之前)。我該如何解決這個問題?
-k
排序選項有兩個數字參數:欄位和字元。您想對第一個欄位的第 6 個字元進行排序。它是第 6 個字元,因為%F{green}
替換為ESC[32m
. 所以這應該工作:print -lP "%F{green}"${^$(setopt)} "%F{red}"${^$(unsetopt)} | sort -k 1.6
在類似 的轉義序列
^[[31m
中,轉義字元^[
是非列印字元,但其他字元[31m
是列印字元。所以sort -i
不會幫助你:它忽略轉義字元,但仍然排序[31mred[0m
before[32mgreen[0m
。根據超出實用程序內置功能的標準對數據進行排序的一種通用方法
sort
是將每行上的數據加倍,對其進行調整,使第一個副本成為排序鍵,對行進行排序,最後剝離第一部分。例如,假設您要排序的數據不包含製表符:awk '{s=$0; gsub(/\033\[[ -?]*[@-~]/,"",s); print s "\t" $0}' | sort | awk 'BEGIN {RS="\t"} {print $2}'