Como rotular ocorrências de texto?

3

Eu gostaria de converter

blue blue red green

para:

color.1=blue color.2=blue color.3=red color.4=green

Alguma pista sobre como lidar com isso? sed, awk, etc?

    
por TuxForLife 27.03.2015 / 19:02

3 respostas

8

No Bash:

colors="blue blue red green"
i=1
for c in $colors; do
    echo -n "color.$((i++))=$c "
done

Versão da linha de comando (fácil de copiar e colar no terminal) com 2 linhas - definindo as variáveis primeiro e depois o script principal:

colors="blue blue red green"; i=1
for c in $colors; do echo -n "color.$((i++))=$c "; done
    
por madneon 27.03.2015 / 19:05
4

Aqui está uma maneira do Python:

#!/usr/bin/env python2
input_string = 'blue blue red green'
count = 1
for value in input_string.split():
    print 'color.{0}={1}'.format(count, value),
    count += 1

Resultado: color.1=blue color.2=blue color.3=red color.4=green

Aqui está uma maneira sed :

$ n=1;x=color;echo "blue blue red green" | sed -rn "s/^([^ ]+) ([^ ]+) ([^ ]+) ([^ ]+)$/$x\.$n= $x\.$((n+1))= $x\.$((n+2))= $x\.$((n+3))=/p" 

Resultado: color.1=blue color.2=blue color.3=red color.4=green

Aqui usamos a variável n para armazenar 1 e x para armazenar a string color , em seguida, usamos o agrupamento e o backreferencing para obter o resultado desejado.

    
por heemayl 27.03.2015 / 19:13
3

Veja a solução awk se suas cores forem muito mais:

awk '{ printf("color.%d=%s ",NR, $0 ) }' RS='[[:blank:]]+' infile
color.1=blue color.2=blue color.3=red color.4=green

RS define espaços / tabulações como R ecord S eparator com ocorrências de uma ou mais vezes + . Em seguida, o comando printf imprime o N atual R ecord / field e, em seguida, imprime o registro / campo inteiro $0 de infile como arquivo de entrada.

    
por devWeek 27.03.2015 / 20:02