2017-05-02 44 views
2

bash中,给定包含(例如颜色)的任意字符串,如何发出可打印字符的子集,并以正确的颜色打印?bash:使用ANSI代码从字符串中发出n个可打印字符

例如,给出:

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

coloursubstr "$s" 2 7 

enter image description here

+0

试着在https://codegolf.stackexchange.com/上提问! –

回答

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
DGREENY

我假定所有的颜色代码开始\e,一端与m和文本通过颜色代码前缀。

-1

部分答案,(与幻数特定设备,而不是在所有普通):

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

输出:

REDGR

DGREENY

+1

请重新阅读:'给定任意字符串'。 –

+0

@TomHale,同样,重新阅读'部分','不...通用'。虽然上述内容对这个Q来说不是一个令人满意的答案,但它可能是第一步或跳板的想法,并且它的工作原理可能对某些读者有用。 – agc