'Это немного сложно, но это можно сделать с помощью sed
(при условии, что файл data
содержит образец ввода):
$ sed '/^\(.\):/{
s//\1/
: retry
s/^\(.\)\([^:]*\):/\1\2\1/
t retry
}' data
1a1b1c
2d2e2f
3a3b
4a4b4c4d4e4f
$
Возможно, вы сможете свести скрипт в одну строку с помощью точек с запятой; sed
в MacOS X иногда немного капризный и не подходит для некоторых частей, поэтому он разбит на 6 строк. Первая строка соответствует строкам, начинающимся с одного символа и двоеточия, и запускает последовательность операций, когда это распознается. Первая замена заменяет, например, «1:» на «1». : retry
также является меткой для ветвления - ключевая часть этого. Следующая подстановка копирует первый символ в строке над первым двоеточием. t retry
возвращается к метке, если замена изменила что-либо. Последняя строка ограничивает всю последовательность операций для первоначально сопоставленной строки.