Zsh

使用 ANSI 轉義碼對字元串進行排序

  • September 28, 2014

我正在嘗試列印所有 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[0mbefore [32mgreen[0m

根據超出實用程序內置功能的標準對數據進行排序的一種通用方法sort是將每行上的數據加倍,對其進行調整,使第一個副本成為排序鍵,對行進行排序,最後剝離第一部分。例如,假設您要排序的數據不包含製表符:

awk '{s=$0; gsub(/\033\[[ -?]*[@-~]/,"",s); print s "\t" $0}' |
sort |
awk 'BEGIN {RS="\t"} {print $2}'

引用自:https://unix.stackexchange.com/questions/157923