Bash 函数将某些行打印为蓝色

Bash 函数将某些行打印为蓝色

我很难理解以下功能。它应该对以-或 以{-using开头的线条进行着色blue。如何仍然打印不匹配的行?

kls ()
 {
  rst='tput sgr0'
  ctp='tput bold; tput setaf 39'
  sed -E "s/^ *\{?-.*/${ctp}; printf '%s' '&';${rst}/e" <<< "$@"
 }

答案1

代码中的两个变量rst和包含 shell 命令。ctp如果您只是让它们包含这些命令的输出,那就更好了,因为它允许我们/e在 GNU 调用中将不安全选项删除到替换命令中sed

kls () {
    local ctp="$( tput bold; tput setaf 39 )"
    local rst="$( tput sgr0 )"
    sed -E "s/^ *\{?-.*/${ctp}&${rst}/" <<< "$@"
}

这个问题似乎是在问如何避免打印不匹配的行。在本例中,您可以使用-nwith 选项来执行此sed操作,该选项会禁用编辑脚本末尾每行的默认输出。然后将/p选项添加到替换命令中,这将导致输出替换修改的行(与正则表达式不匹配的行将不会被输出)。

kls () {
    local ctp="$( tput bold; tput setaf 39 )"
    local rst="$( tput sgr0 )"
    sed -E -n "s/^ *\{?-.*/${ctp}&${rst}/p" <<< "$@"
}

为了使其更像一个过滤器,请将重定向放入sed

kls () {
    local ctp="$( tput bold; tput setaf 39 )"
    local rst="$( tput sgr0 )"
    sed -E -n "s/^ *\{?-.*/${ctp}&${rst}/p"
}

你可以使用它

printf '%s\n' "some" "strings" | kls

或者

kls <some-file

或者

some-general-command | kls

相关内容