6

非常に頻繁に--help、コマンドのフラグを使用してヘルプ情報を取得します。これにより、ターミナルに次のような出力が得られます。

$ vmtkimagereader --help

Creating vmtkImageReader instance.
Automatic piping vmtkimagereader
Parsing options vmtkimagereader

vmtkimagereader : read an image and stores it in a vtkImageData object
  Input arguments:
   -id Id (str,1); default=0: script id
   -handle Self (self,1): handle to self
   -disabled Disabled (bool,1); default=0: disable execution and
     piping

リンクの上半分のように、出力をシンタックス ハイライトしたい(リンクを 1 つしか投稿できなくて申し訳ありません)。ハイライトとピグメンタイズを試しました。ただし、ハイライトには構文を指定する必要があり、pygmentize は出力を間違ったスタイルとしてレンダリングしました (リンクの下半分)。

このようにシンタックスハイライトにする方法があれば教えていただきたいです。pygmentize のスタイルを指定する必要がありますか? それとも、別の解決策に頼る必要がありますか?

ありがとう!

4

2 に答える 2

4

ANSI エスケープ文字列

ANSI エスケープ シーケンスを使用して目的を達成するために、書式文字列 ( prepended\e[とappendedで表されるm)を作成できます。 . 例えば、38;5;{0..255}0..25548;5;{0..255}

echo -e "\e[38;5;0;48;5;255mText\e[0m"

0白い背景 (カラー コード) で黒のテキスト (カラー コード) を印刷します255。このコマンドでは、ANSI エスケープ文字列を解釈するechoために拡張モード (フラグで切り替える) が必要であることに注意してください。-e

カラーリングを設定解除するための末尾に注意してください\e[0m。そうしないと、このコマンドの後に出力されるすべてのテキストechoがフォーマットを保持します。\e[0mリセットします。

エラーも発生する興味深い使用例に注意してください。エンディングの前に感嘆符を置くと、次の\e[0m出力が発生します。

nick@nick-lt:~$ echo -e "\e[38;5;0;48;5;255mText!\e[0m"
bash: !\e[0m: event not found

これ!は、Bash の文字列展開の一部であるためです。この SO の質問の詳細については、こちらを参照してください。期待どおりに機能させるには、次のことを行う必要があります。

echo -e "\e[38;5;0;48;5;255mText"'!'"\e[0m"

一重引用符は展開されないためです。


ANSI エスケープ シーケンスを使用して、使用可能なすべての色を印刷する方法。

これらを というファイルに保存しますcolor-functions.sh

function color_list_text() {
    # First paramter can be an optional background color
    local BGCOLOR="$1"

    COLOR=
    # Loop through the number range 0 to 255
    for COLOR in {0..255}; do
        local BGCOLORFORM=""
        # If our first parameter has a value, then create a background
        # format in ANSI escape sequence, assign to $BGCOLORFORM
        [[ -z "$BGCOLOR" ]] && BGCOLORFORM="48;5;${BGCOLOR};"

        # Create the whole ANSI escape sequence, assign to $TEXTFORM
        local TEXTFORM="${BGCOLORFORM}38;5;${COLOR}m"

        echo -en "\e[${TEXTFORM} ${COLOR}\t\e[0m"

        [[ $(( (COLOR + 1) % 16 )) -eq 0 ]] && echo
    done

    return 0
}

function color_list_text_backgrounds() {
    local TEXTCOLOR="$1"

    local COLOR
    for COLOR in {0..255}; do
        local TEXTCOLORFORM=""
        [[ -z "$TEXTCOLOR" ]] && TEXTCOLORFORM="38;5;${TEXTCOLOR};"

        local TEXTFORM="${TEXTCOLORFORM}48;5;${COLOR}m"

        echo -en "\e[${TEXTFORM} ${COLOR}\t\e[0m"

        [[ $(( (COLOR + 1) % 16 )) -eq 0 ]] && echo
    done

    return 0
}

次に、別のファイルで、関数を呼び出した後に関数を呼び出しますsource

source color-functions.sh

# Loops through and prints all ANSI escape sequence's available text colors
color_list_text
# Loops through and prints all ANSI escape sequence's available text backgrounds
color_list_backgrounds

これは両方を行う関数です...しかし、出力が大きすぎるため、やり過ぎだと思います(256 * 256 = 2 ^ 16の組み合わせが出力されます):

function color_list_text_and_backgrounds() {
    local BG
    for BG in {0..255}; do
        local TEXT
        for TEXT in {0..255}; do
            echo -en "\e[38;5;${TEXT};48;5;${BG}m ${TEXT}\t\e[0m"

            if [[ $(( (TEXT + 1) % 8 )) -eq 0 ]]; then
                if [[ $(( ((TEXT + 1) / 8) )) -eq 16 ]]; then
                    local INVBG=$(( (BG + 128) % 256 ))
                    echo -en "\e[38;5;${INVBG};48;5;${BG}m ${BG}\t\e[0m"
                else
                    echo -en "\e[48;5;${BG}m\t\e[0m"
                fi

                echo
            fi
        done
    done

    return 0
}

あなたのユースケース

特定のものに特定の色を付けるには、egrep -i( -iflag は大文字と小文字を区別しません) とGREP_COLOR変数を使用できます。

echo "Some string to color" | \
    GREP_COLOR='38;5;200' egrep -i --color=always 'some' | \
    GREP_COLOR='38;5;100' egrep -i --color=always 'string|color'

または、本当に賢く、これを関数化することもできます。

color_text_match() {
    MATCHSTRING="$1"
    COLOR="$2"

    [[ -z "$MATCHSTRING" ]] && echo "color_text_match: No color specifies." 
    [[ -z "$COLOR" ]] && COLOR="214"   # Default orange

    GREP_COLOR="38;5;$COLOR" egrep -i --color=always "$MATCHSTRING"
}

それで:

echo "Some string to color" | \
    color_text_match "Some" | \
    color_text_match "string" | \
    color_text_match "to" "226"
于 2016-08-13T12:19:33.267 に答える