変数がありますvar
。Code:
in以降の行を印刷したいがblue
指定された行は削除し、残りは でCode:
印刷しようとしますgreen
。 Ubuntuを実行する変数処理を実行するには、awkを呼び出すbashスクリプトを使用します。
sgr="$( tput sgr0 )"
grn="$( tput bold; tput setaf 34 )"
blu="$( tput bold; tput setaf 39 )"
var="
Description
Code:
for i in {1..72..1}; do shft+=\" \"; done
Details"
printf '%s\n' "$var" \
| awk -v kb="$blu" -v kg="$grn" -v rst="$sgr" \
'{ codefound = 0
fm="%s%s%s\n"
if (codefound) { printf(fm, kb, $0, rst) }
else { printf(fm, kg, $0, rst) }
}'
色自体を定義する方法はawk
?
次のように生成したいと思います(#はテキストの前景色を説明するために使用されます)。
Description # green
for i in {1..72..1}; do shft+=" "; done # blue
Details # green
答え1
主に回答に基づくawkを使用してbashから出力を色付けする、これはこの場合に必要なものであり、前景および/または背景色(複数)を変更する必要がある場合もあります。
$ cat tst.awk
BEGIN {
split("BLACK RED GREEN YELLOW BLUE MAGENTA CYAN WHITE",tputColors)
for (i in tputColors) {
colorName = tputColors[i]
colorNr = i-1
cmd = "tput setaf " colorNr
fgEscSeq[colorName] = ( (cmd | getline escSeq) > 0 ? escSeq : "<" colorName ">" )
close(cmd)
cmd = "tput setab " colorNr
bgEscSeq[colorName] = ( (cmd | getline escSeq) > 0 ? escSeq : "<" colorName ">" )
close(cmd)
}
cmd = "tput sgr0"
colorOff = ( (cmd | getline escSeq) > 0 ? escSeq : "<sgr0>" )
close(cmd)
fgColor = dfltFgColor = "GREEN"
}
/Code:/ { fgColor = "BLUE"; next }
!NF { fgColor = dfltFgColor }
{ print fgEscSeq[fgColor] $0 colorOff }
tput
以下を使用して色を定義したくない場合awkやその他の方法による線の検索と色の指定エスケープシーケンスを使用する方法を学びます。
答え2
awkでANSIエスケープコードを使用して、文字列「WORD」を含む行などの行の色を指定するには、次のようにします。
printf '%s\n' "$var" |
awk '
BEGIN{
blue ="\033[1;44m"
rst ="\033[0m"
}
/WORD/{ $0=blue $0 rst }1'
必要なタスクを実行するコードは次のとおりです。
printf '%s\n' "$var" |
awk '
BEGIN{
green ="\033[1;42m" #default output color
blue ="\033[1;44m"
rst ="\033[0m"
}
/Code:$/ { Clr=1; next } # active the blue colored ouptut
/Details$/{ Clr=0 } # disable the blue colored output
{ print (Clr? blue : green) $0 rst }'
バラよりANSIエスケープコード
答え3
awk
私はこれを使用せずにsed
次のものを使用しますprintf
。
#!/bin/bash
var="
Description
Code:
for i in {1..72..1}; do shft+=' '; done
Details"
sgr="$( tput sgr0 )"
grn="$( tput bold; tput setaf 34 )"
blu="$( tput bold; tput setaf 39 )"
printf "%s" "$grn"; sed -E "s/Code:/$blu/; s/^( *Details.*)/${grn}\1${sgr}/" <<<"$var";
これで以下が生成されます。
主張すると、awk
次のように動作します。
#!/bin/bash
var="
Description
Code:
for i in {1..72..1}; do shft+=' '; done
Details"
sgr="$( tput sgr0 )"
grn="$( tput bold; tput setaf 34 )"
blu="$( tput bold; tput setaf 39 )"
awk -v sgr="$( tput sgr0 )" \
-v grn="$( tput bold; tput setaf 34 )" \
-v blu="$( tput bold; tput setaf 39 )" \
'BEGIN{ printf "%s", grn }
{
if(/Code:/){ printf "%s", blu }
else if(/Details/){ printf "%s%s%s\n",grn, $0, sgr }
else { print }
}' <<<"$var";