Em uma seqüência de escape como ^[[31m , o caractere de escape ^[ não é impresso, mas os outros caracteres [31m são caracteres de impressão. Portanto, sort -i não ajudará: ignora os caracteres de escape, mas ainda classifica [31mred[0m antes de [32mgreen[0m .
Uma maneira genérica de classificar os dados de acordo com critérios que vão além das capacidades integradas do utilitário sort é dobrar os dados em cada linha, massageando-o de forma que a primeira cópia seja a chave de ordenação, classifique o linhas e, finalmente, tira a primeira parte. Por exemplo, supondo que os dados que você deseja classificar não contenham caracteres de tabulação:
awk '{s=$0; gsub(/3\[[ -?]*[@-~]/,"",s); print s "\t" $0}' |
sort |
awk 'BEGIN {RS="\t"} {print $2}'