私は変数の内容を印刷し、与えられたパターンに一致するすべての行を強調表示するbash関数を書くことに興味があります。
awk
以下は変数の行を処理するために使用されます。ただし、これは一致するパターンでは機能しませんが、色を付ける行を指定すると機能します(例:lseq = "2,3,5")。
aid ()
{
local -r sgr="$( tput sgr0 )"
local -r blu="$( tput bold; tput setaf 39 )"
awk -v frg="$blu" -v rst="$sgr" -v lnum="$lseq" ptrn="$rl" \
'BEGIN { split(lnum, laggr, ",") }
{
found = 0
for (item in laggr) {
if (laggr[item] == NR) { found = 1 ; break }
}
if (found) { print frg $0 rst }
else { print $0 }
}' <<< "$@"
}
edvart
たとえば、青いフォアグラウンドで始まる行を印刷したい次のようないくつかの行変数があります。
rl="^[[:space:]]*edvart .*$"
var="
Here is an example
edvart -W
Some description
Introduction
Menu
Interactive"
ベストアンサー1
この問題を解決するための主な要素は次のとおりです。
tput
着色のために- ソーステキストをパイプに入れる
- ライン作業
while
/を使用したソリューションは次のとおりです。read
rst=$( tput sgr0 ) ; hi=$( tput bold; tput setaf 39 )
printf '%s\n' "$source" \
| while read line
do
if [[ "$line" =~ "$pattern" ]]; then
printf '%s\n' "${hi}${line}${rst}"
else
printf '%s\n' "$line"
fi
done
構文は=~
bashにのみ適用されます。grep
ifステートメントでこれを使用して終了ステータスを利用できますが、質問に「bash」タグを付けたので、ここでは表示しません。
解決策は次のとおりですawk
。
rst=$( tput sgr0 ) ; hi=$( tput bold; tput setaf 39 )
printf '%s\n' "$source" \
| awk '{
if ( $0 ~ /'"$pattern"'/ ) {
printf "'${hi}'%s'${rst}'\n", $0
} else {
print
}
}'
別の解決策は次のとおりですsed
。
rst=$( tput sgr0 ) ; hi=$( tput bold; tput setaf 39 )
printf '%s\n' "$source" | sed "/$pattern/s/^.*$/${hi}&${rst}/"
awk
との場合は、sed
awk / sedスクリプトに色/形式を技術的に含めています。したがって、実際には変数は必要ありませんhi
。rst
しかし、私の考えでは、それはより読みやすいと思います。
awk
ソリューションはsed
ソリューションよりも移植性に優れており、read
すべてのPOSIX互換システムで実行できます。
行全体ではなく一致する文字列のみを強調表示するには、を使用することをお勧めしますsed
。
rst=$( tput sgr0 ) ; hi=$( tput bold; tput setaf 39 )
printf "$source" | sed "s/$pattern/${hi}&${rst}/g"