Как маркировать вхождения текста?

Я хотел бы преобразовать

blue blue red green

чтобы:

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

Есть ли какие-либо вопросы о том, как решить эту проблему? sed, awk и т. д.?

3 ответа

Решение

В Баш:

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

Версия для командной строки (легко копировать и вставлять в терминал) с двумя строками - сначала установка переменных, а затем основной скрипт:

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

Вот способ 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

Выход: color.1=blue color.2=blue color.3=red color.4=green

Вот sed путь:

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

Выход: color.1=blue color.2=blue color.3=red color.4=green

Здесь мы использовали переменную n хранить 1 а также x хранить строку colorЗатем использовали группировку и обратную ссылку для получения желаемого результата.

Вот решение awk, если ваши цвета так больше:

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

RS определяет пробелы / табуляции как разделитель R ecord с вхождениями один или несколько раз +, Тогда printf команда печатает текущий номер поля / поля и затем печатает всю запись / поле $0 из infile в качестве входного файла.

Другие вопросы по тегам