bash:从带有ANSI代码的字符串中发出n个可打印字符

时间:2017-05-02 05:30:24

标签: bash ansi-escape

buy.php中,给定包含ANSI CSI codes的任意字符串(例如颜色),如何以正确的颜色打印可打印字符的子集?

例如,给定:

bash

enter image description here

我该怎么做:

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

enter image description here

coloursubstr "$s" 0 5 

enter image description here

2 个答案:

答案 0 :(得分:2)

使用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

输出:

REDGR {
{3}}

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

答案 1 :(得分:-1)

部分答案,(具有魔法数字的特定黑客,一般都没有):

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

输出:

REDGR

DGREENY