tcshスクリプトに '\ n'で区切られ、内部にスペースがある可能性がある文のリストがあります。 lsスタイルで表示したいので、「echo $list | column」を実行しました。色を使わないときに効果的です。結果は次のとおりです。
その後、毎回変更されるいくつかの項目(最新の3つの選択肢)を強調表示する必要があります。強調表示したい項目の周りにカラーシーケンス(\ e [33 mと¥ e [0 m)を追加し、それを$ listに入れます。 "echo $list|column" と表示すると、色は大丈夫ですが、下の画像に示すようにテキストは整列しません。
'|column'を使用せずに試しましたが、文字列が私が望むスタイルではない場合でも、1列に正しく表示されることに注意してください。
問題に対する解決策はありますか?
ところで検索を少ししてみると、その列にバグがあるようです。この列に管理者がいますか?問題をどこに報告する必要がありますか?
注: 読みました。列コマンドとカラーエスケープコードに関する問題投稿する前に。彼の形式は固定されていますが、私のカラープロジェクトは動的です。したがって、単にprintfを使用するか、列の後ろに色を追加しても機能しません。
答え1
出力に色を割り当てるエスケープシーケンスは理解されず、column
入力から「印刷可能文字」を計算しなければ理解されません。たとえば、テキストを緑色()に置き換えるシーケンスには、^[[0;32m
印刷可能な6つの文字が含まれており、そのように計算されます。
column
列の幅を決定したときに実際に表示される内容を確認するには、次の手順を試してください。
ls --color=always / | tr -dc '\n -~' | column -s '\n'
このオプションをサポートしていない場合は、ls --color=always /
すべてのコマンドをカラー出力に置き換えてください。ls
column
これらのエスケープシーケンスを無視する説得力はありませんが、後で色を追加できます。
to-list
次のようなファイルがあるとしましょう。
1: avifsc01
2: avifsh01_bg4dtva0f
3: avifsh01_bg5dtvz1f
4: bg2ctqz1
5: bg2dtva0
6: bg3cda0
7: bg3cda1
8: bg3cdpa0
9: bg3z1
10: bg4cdpa0f
11: bg4cdpz1f
12: bg4cdz1f
13: bg4cta0f
14: bg4ctpa0f
15: bg4ctpz1f
16: bg4ctz1f
17: bg4dtva0f
18: bg4dtvz1f
19: bg5ctpz1f
20: bg5ctz1f
21: bg5dtvz1f
22: bg6ctz1f
23: bgpk01
24: dsc
25: test
26: vpp01
27: vrdlib01
その後、次のことができます。
list=$(cat to-list)
特定のアイテムに色を付けたいとしましょう。
to_color='bg3cda0 bg4dtva0f bg6ctz1f'
column
リストを着色する前に書式を設定できます。
printf '%s\n' "${list}" \
| column -s '\n' \
| sed "s@$( (printf '%s\\|' ${to_color}; echo) \
| sed 's@^@\\([0-9][0-9]*: \\(@' \
| sed 's@\\|$@\\)\\)@' \
)@$(printf '\033')[33m\1$(printf '\033')[0m@g"
${list}
2つの変数(および)を生成する方法がある限り、${to_color}
これらの項目は動的に生成できます。
結果:
答え2
色の順序は文字数を混在させるcolumn
ので、次のように列ステップの後に色を追加できます。
set items2color = ( "bg3cda0" "bg4dtva0f" "bg6ctz1f" )
echo "$list" | column |\
perl -slpe '\
for my $c ( split /\s+/, $C ) {\
s/(?:(?<=^)|(?<=\t))\d+:\s+\Q$c\E(?=\t|$)/\e[31m$&\e[0m/;\
}\
' -- -C="$items2color"
色付けしたい特定の項目はコマンドラインのoptionsに配置されますが、-C
名前を変更することができ、Perlは$ C変数を介してその名前を使用できます。スペースで区切られたアイテムのリストなので、スペースで分割し、正規表現を現在の行に適用します。行の末尾にあるバックスラッシュは、作業中のリスト変数tcsh
だと言ったからです。tcsh
正規表現
正規表現の簡単な作業は次のとおりです。正規表現はどの変数にも関連付けられていないため、これは$_変数(私たちの場合は現在の行)にリンクされていることを意味します。
/
(?: # From where we are,
(?<=^) # we see the beginning of the current line to our left
| # OR
(?<=\t) # we see a TAB to our left
)
# We are the beginning of a digit
\d+: # followed by one or more digits, ending in a colon
\s+ # then atleast one whitespace
\Q$c\E # followed by the item to be colored. \Q...\E quote the $c should
# it comprise any characters which mean something to the regex.
(?= \t | $ ) # we see a TAB or the end of line to our right
/x;