切り取り線と同じですが、色分けが正しい [重複]

切り取り線と同じですが、色分けが正しい [重複]

線を切るのは簡単です:

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
  • echoargs:-Eカラーコードを同じままにして色を把握するために使用されます。
  • grepargs:-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"

この方法は、最後のカラーコードの後に​​切り取ると機能します。カラーコードの配置を検討するには、より複雑なものを作成する必要があります。

おすすめ記事