【问题标题】:bash: Emit n printable characters from a string with ANSI codesbash:从带有 ANSI 代码的字符串中发出 n 个可打印字符
【发布时间】:2017-05-02 05:30:24
【问题描述】:

在bash 中,给定一个包含ANSI CSI codes 的任意字符串(例如颜色),我如何发出以正确颜色打印的可打印字符的子集?

例如,给定:

s=$'\e[0;1;31mRED\e[0;1;32mGREEN\e[0;1;33mYELLOW'

我该怎么做:

coloursubstr "$s" 0 5 

coloursubstr "$s" 2 7 

【问题讨论】:

标签: bash ansi-escape


【解决方案1】:

使用 bash 和 GNU grep:

coloursubstr() {
  local string="$1" from="$2" num="$3"
  local line i array=()

  # fill array
  while IFS= read -r line; do
    [[ $line =~ ^([^m]+m)(.*)$ ]]
    for ((i=0;i<${#BASH_REMATCH[2]};i++)); do
      array+=("${BASH_REMATCH[1]}${BASH_REMATCH[2]:$i:1}")
    done
  done < <(grep -Po $'\x1b.*?m[^\x1b]*' <<< "$string")

  # print array
  for ((i=$from;i<$from+$num;i++)); do
    printf "%s" "${array[$i]}"
  done
  echo
}

s=$'\e[0;1;31mRED\e[0;1;32mGREEN\e[0;1;33mYELLOW'

coloursubstr "$s" 0 5
coloursubstr "$s" 2 7

输出:


我假设所有颜色代码都以\e 开头,以m 结尾,并且文本以颜色代码为前缀。

【讨论】:

    【解决方案2】:

    部分答案,(带有幻数的特定技巧,一点也不笼统):

    echo "${s:0:23}"
    echo "${s:0:9}${s:11:25}"
    

    输出:

    【讨论】:

    • @TomHale,同样,重新阅读Partial,not ... general。虽然以上对于这个问题不是一个令人满意的答案,但它可能是第一步或跳板想法,而且它完全有效的事实可能对某些读者有用。
    猜你喜欢
    • 1970-01-01
    • 2023-02-15
    • 2021-12-09
    • 1970-01-01
    • 1970-01-01
    • 2013-12-08
    • 1970-01-01
    • 2023-03-16
    • 2017-11-23
    相关资源
    最近更新 更多