2017-05-02 1 views
2

の文字列からn個の印字可能な文字を出力bashに、(たとえば色)の任意の文字列を指定すると、正しい色で印刷された印刷可能な文字のサブセットを出力するにはどうすればよいですか?bash:ANSIコード

与え例えば:

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 

+0

https://codegolf.stackexchange.com/にお問い合わせください。 –

答えて

2

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}" 

出力:bashのとGNU grepので

REDGR

DGREENY

+1

「任意の文字列を与えられました」と読み替えてください。 –

+0

@TomHale、同様に、 'Partial'、' not ... general'を再読み込みします。上記はQに満足のいく答えではありませんが、それは最初のステップまたは踏み台のアイデアかもしれません。そして、それがまったく動作するという事実は、一部の読者の役に立つかもしれません。 – agc