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() 函数的第二个增强是正则表达式,您可能需要使用index(in, find)函数来代替文字匹配prl

您还可以使用常规 awk 正则表达式匹配来代替 match() 之类$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 }
' <<< "$@"

相关内容