Как маркировать вхождения текста?
Я хотел бы преобразовать
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 в качестве входного файла.