2

私はbashとsedが初めてです。who出力を取得して各行をインデントし、その過程でユーザー名を色付けしたいと思います。これが私がこれまでに持っているものです:

#!/bin/bash
BOLD="\e[1m"
UNBOLD="\e[0m"
GREEN="\e[32m"
DEFAULT="\e[39m"

who | sed "s@\\([a-z_][a-z0-9_]{0,30}\\) \\(.*\\)@\\t$BOLD$GREEN\\1$DEFAULT$UNBOLD\\2@"

現在、何も変更せずに出力を印刷するだけです。問題はエスケープに関係していると確信していますが、何が必要で何が必要でないかはわかりません。

ありがとう!

4

1 に答える 1

2

2 つの問題があります。1 つ目は、コマンドが期待どおりに動作していないことです。まずそれを修正しましょう。ユーザーを太字の緑で書き、残りをデフォルトの太字で書きたいと思います。これはより良いはずです:

#!/bin/bash
bold="\e[1m"
unbold="\e[0m"
green="\e[32m"
default="\e[39m"
who | sed "s/^\([[:alpha:]_]\+\)\(.*\)/$bold$green\1$default$unbold\2/"

それとも本当に良いですか?素敵な色の代わりに醜いコードが表示されます。そして、これはあなたの2番目の問題です。これを修正する方法は次のとおりです。

#!/bin/bash
bold=$'\e[1m'
unbold=$'\e[0m'
green=$'\e[32m'
default=$'\e[39m'
who | sed "s/^\([[:alpha:]_]\+\)\(.*\)/$bold$green\1$default$unbold\2/"

または、 ANSI-C の引用が気に入らない場合は、次のようにします。

#!/bin/bash
bold=$(echo -e "\e[1m")
unbold=$(echo -e "\e[0m")
green=$(echo -e "\e[32m")
default=$(echo -e "\e[39m")
who | sed "s/^\([[:alpha:]_]\+\)\(.*\)/$bold$green\1$default$unbold\2/"

ノート。で大文字の変数名を使用することは非常に悪い習慣と考えられています。多くの人がそれをやっているのを見ると思いますが、それは本当に間違っています。そのため、すべての変数を小文字にしました。

于 2013-06-29T16:49:01.130 に答える