Bash
你如何只為 bash 腳本的一些關鍵字著色?
我正在執行一些單元測試程式碼。單元測試程式碼輸出正常文本。有很多文字,所以我想為使用者突出顯示重要的關鍵字。
在這種情況下,關鍵字是“PASS”和“FAIL”。
您如何將“PASS”著色為綠色並將“FAIL”著色為紅色?
這是一個為正則表達式模式著色的通用腳本(可能需要一些修飾):
#! /bin/bash color_to_num () { case $1 in black) echo 0;; red) echo 1;; green) echo 2;; yellow) echo 3;; blue) echo 4;; purple) echo 5;; cyan) echo 6;; white) echo 7;; *) echo 0;; esac } # default values for foreground and background colors bg= fg= bold="$(tput bold)" italics="" boundary="" while getopts f:b:sli option; do case "$option" in f) fg="$OPTARG";; b) bg="$OPTARG";; s) bold="";; l) boundary=".*";; i) italics="$(tput sitm)";; esac done shift $(($OPTIND - 1)) pattern="$*" if [ -n "$fg" ]; then fg=$(tput setaf $(color_to_num $fg)) fi if [ -n "$bg" ]; then bg=$(tput setab $(color_to_num $bg)) fi if [ -z "$fg$bg" ]; then fg=$(tput smso) fi sed "s/${boundary}${pattern}${boundary}/${bold}${italics}${fg}${bg}&$(tput sgr0)/g"
命名它
hilite.sh
並以這種方式使用它:$ ./BIN_PROGRAM | hilite.sh -f green PASS | hilite.sh -f red FAIL $ # Here is an example one liner $ echo -e "line 1: PASS\nline 2: FAIL" | hilite.sh -f green PASS | hilite.sh -f red FAIL
supercat
似乎做你正在尋找的東西。包裝:超級貓 描述-zh:為終端和 HTML 著色文本的程序 Supercat 是一個基於匹配正則著色文本的程序 表達式/字元串/字元。Supercat 也支持 html 輸出 作為標準 ASCII 文本。與一些文本著色程序不同, 存在,Supercat 不需要你必須是程序員才能 制定著色規則。 首頁:http://supercat.nosredna.net/
似乎沒有任何方法可以告訴它在命令行上著色什麼,您必須指定一個配置文件。
我似乎記得曾經有一個名為“hilite”或“hl”的程序突出顯示與模式匹配的文本(例如
grep --colour
,但也顯示不匹配的行),但是當我搜尋它時找不到它。最後,GNU
grep
可用於突出顯示模式——但只能使用一種顏色(即,您不能使用綠色的 PASS 和紅色的 FAIL,兩者都將用相同的顏色突出顯示)。通過這樣的方式管道傳輸您的數據:
egrep --color "\b(PASS|FAIL)\b|$"
此範例使用 egrep (aka
grep -E
),但-G
基本的正則表達式、-F
固定字元串和-P
PCRE 也可以使用。所有比賽都將突出顯示。預設為紅色,或設置 GREP_COLOR 環境變數。
這項工作的關鍵是
|$
模式中的最終匹配行尾(即所有行匹配),因此將顯示所有行(但不著色)。它們是字邊界標記,因此
\b
它匹配例如 FAIL 但不匹配 FAILURE。它們不是必需的,因此如果要匹配部分單詞,請刪除它們。這是我昨天寫的 supercat 的範例包裝腳本。它可以工作,但在編寫它時,我發現 supercat 沒有任何不區分大小寫搜尋的選項。IMO,這使得該程序的用處大大降低。但是,它確實大大簡化了腳本,因為我不必編寫“-i”選項:)
#! /bin/bash # Requires: tempfile from debian-utils, getopt from util-linux, and supercat SCRIPTNAME=$(basename $0) CFGFILE=$(tempfile -p spc) usage() { cat <<__EOF__ Highlight regexp patterns found on stdin or files specified on command line with specified colours. Usage: $SCRIPTNAME [ --colour "pattern" ...] [FILE] Options: -k,--black regexp -r,--red regexp -g,--green regexp -y,--yellow regexp -b,--blue regexp -m,--magenta regexp -c,--cyan regexp -w,--white regexp Example: run-script.sh | $SCRIPTNAME --green PASS --red FAIL __EOF__ exit 0 } # Format definition from the spc man page: #1234567890123456789012345678901234567890123456789012345 #HTML Color Name Col A N T RE / String / Characters FMT="%-20s %3s %1s %1s %1s (%s)\n" add_color_to_config() { COLOR="$1" PATTERN="$2" printf "$FMT" "$COLOR" "$COLOR" - 0 r "$PATTERN" >> "$CFGFILE" } # uses the "getopt" program from util-linux, which supports long # options. The "getopts" built-in to bash does not. TEMP=$(getopt \ -o 'hk:r:g:y:b:m:c:w:' \ -l 'help,black:,red:,green:,yellow:,blue:,magenta:,cyan:,white:' \ -n "$0" -- "$@") if [ $? != 0 ] ; then echo "Terminating..." >&2 ; exit 1 ; fi eval set -- "$TEMP" while true ; do case "$1" in -k|--bla*) add_color_to_config blk "$2" ; shift 2 ;; -r|--red) add_color_to_config red "$2" ; shift 2 ;; -g|--gre*) add_color_to_config grn "$2" ; shift 2 ;; -y|--yel*) add_color_to_config yel "$2" ; shift 2 ;; -b|--blu*) add_color_to_config blu "$2" ; shift 2 ;; -m|--mag*) add_color_to_config mag "$2" ; shift 2 ;; -c|--cya*) add_color_to_config cya "$2" ; shift 2 ;; -w|--whi*) add_color_to_config whi "$2" ; shift 2 ;; -h|--hel*) usage ; exit 0 ;; --) shift ; break ;; *) echo 'Unknown option!' ; exit 1 ;; esac done spc -R -c "$CFGFILE" "$@" rm -f "$CFGFILE"