2017-05-02 3 views
2

In bash, eine beliebige Zeichenfolge mit (z. B. Farben), wie gebe ich eine Teilmenge der druckbaren Zeichen, in den richtigen Farben gedruckt?bash: Gibt n druckbare Zeichen aus einem String mit ANSI-Codes aus

ZB gegeben:

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

enter image description here

Wie mache ich so etwas wie:

coloursubstr "$s" 0 5 

enter image description here

coloursubstr "$s" 2 7 

enter image description here

+0

Versuchen Sie dies auf https://codegolf.stackexchange.com/ zu stellen! –

Antwort

2

Mit bash und 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 

Ausgang:

REDGR
DGREENY

Ich nehme alle Farbcodes beginnen mit \e, Ende mit m und Text wird durch einen Farbcode vorangestellt.

-1

Teilantwort, (spezifischer Hack mit magischen Zahlen, überhaupt nicht allgemein):

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

Ausgang:

REDGR

DGREENY

+1

Bitte lesen Sie erneut: 'gegeben eine beliebige Zeichenfolge '. –

+0

@TomHale, Gleichermaßen "Teilweise", "nicht ... allgemein" erneut lesen. Während das Obige * keine befriedigende Antwort auf dieses Q ist, könnte es ein erster Schritt oder Sprungbrett Idee sein, und die Tatsache, dass es überhaupt funktioniert, kann für einige Leser nützlich sein. – agc

Verwandte Themen