カラー出力はカスタムパターンによって異なります

カラー出力はカスタムパターンによって異なります

私は変数の内容を印刷し、与えられたパターンに一致するすべての行を強調表示する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

この問題を解決するための主な要素は次のとおりです。

  1. tput着色のために
  2. ソーステキストをパイプに入れる
  3. ライン作業

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にのみ適用されます。grepifステートメントでこれを使用して終了ステータスを利用できますが、質問に「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との場合は、sedawk / sedスクリプトに色/形式を技術的に含めています。したがって、実際には変数は必要ありませんhirstしかし、私の考えでは、それはより読みやすいと思います。

awkソリューションはsedソリューションよりも移植性に優れており、readすべてのPOSIX互換システムで実行できます。

行全体ではなく一致する文字列のみを強調表示するには、を使用することをお勧めしますsed

rst=$( tput sgr0 ) ; hi=$( tput bold; tput setaf 39 )
printf "$source" | sed "s/$pattern/${hi}&${rst}/g"

おすすめ記事