線を切るのは簡単です:
print -l $array | cut -$COLUMNS
...しかし、配列の線に色がある場合、カラーコードは線の幅に含まれているため、クリッピングが正しくないため、実際には色線が短すぎるように切り捨てられます。事前に作成された修正はありますか?大まかに言えば、一行に色付きの単語がある場合は、次のようにします。
... $(( COLUMNS + 17 ))
…もちろん、より多くの色の単語がある場合、それは間違っています。
ベストアンサー1
何らかの方法でエスケープコードで使用されている文字数を数えて$ COLUMNSに追加する必要があります。
カウントを取得する方法は次のとおりです。
echo -E $mystring | grep -Eoz '\\e\[[0-9;]+m' | sed -e 's/\x00//g' | wc -m
echo
args:-E
カラーコードを同じままにして色を把握するために使用されます。grep
args:-E
拡張正規表現と一致するために使用され、行-o
の一致する部分のみを返すために使用され、-z
改行文字を置き換えるために使用されます\x00
- それからそれを使ってバイトを
sed
削除し、最後に\x00
wc
文字数を返します。
さて、いくつかのサンプル文字列でこれをテストしてみましょう。
mystring='\e[1;31;3mThis is red text, and \e[1;32mthis is green text \e[0m'
echo -E "$mystring" | grep -Eoz '\\e\[[0-9;]+m' | sed -e 's/\x00//g' | wc -m
echo -e "$mystring"
よさそうですね。 23を印刷してから、文字列に色を適用します。今すべてを構築します。
cols=20
mystring='\e[1;31;3mThis is red text, and \e[1;32mthis is green text \e[0m'
# strip the reset escape code from end of the line so it doesn't get counted
mystring=$(echo -E $mystring | sed -e 's/\\e\[0m$//g')
# count the escape codes
countesc=$(echo -E "$mystring" | grep -Eoz '\\e\[[0-9;]+m' | sed -e 's/\x00//g' | wc -m)
# cut the line while accounting for escape codes, and add back the reset escape code to the end
echo -e $(echo -E "$mystring" | cut -b -$((cols+countesc)))"\e[0m"
この方法は、最後のカラーコードの後に切り取ると機能します。カラーコードの配置を検討するには、より複雑なものを作成する必要があります。