Bashスクリプトのawk printfが無効です。

Bashスクリプトのawk printfが無効です。

ビルドが機能しないのはなぜですかprintf

awk -v frg="$ctp" -v rst="$sgr" -v prl="$rl"  \
  '{ hit = match($0, /prl/)
     if (hit) {
       fm="%s%s%s\n" ; printf fm frg $0 rst }
     else {
       fm="%s\n" ; printf fm $0 }
   }' <<< "$@"

答え1

awk -v frg="$ctp" -v rst="$sgr" -v prl="$rl" '
{ hit = match($0, prl)
  if (hit) {
    fm="%s%s%s\n" ; printf fm, frg, $0, rst }
  else {
    fm="%s\n" ; printf fm, $0 
  }
}' <<< "$@"

正しい:

  • match($0, /prl/)~になるmatch($0, prl)
  • printfパラメータはコンマで区切る必要があります。

注:match()関数の2番目の改善は正規表現です。index(in, find)リテラルマッチングを置き換える関数プロル

match()などの代わりに通常のawk正規表現マッチングを使用することもできます$0 ~ prl(再び正規表現マッチングが必要で、パターンに正規表現文字がないと仮定する場合/)。

awk -v frg="$ctp" -v rst="$sgr" -v prl="$rl" '
{ 
  if ($0 ~ prl) {
    fm="%s%s%s\n" ; printf fm, frg, $0, rst }
  else {
    fm="%s\n" ; printf fm, $0
  }
}' <<< "$@"

同様に、最終的にコードを単純化すると、次のように書くことができます。

awk -v frg="$ctp" -v rst="$sgr" -v prl="$rl" '
  { print ($0 ~ prl ? frg $0 rst: $0 }
' <<< "$@"

関連情報