Почему echo ,,, |sed s':\(,\)\(,\):\1*\2:'gуступает " ,*,,", а не " ,*,*,"? Другими словами: почему, несмотря на флаг "g", sed не вставляет ' *' между одной парой запятых?
Почему echo ,,, |sed s':\(,\)\(,\):\1*\2:'gуступает " ,*,,", а не " ,*,*,"? Другими словами: почему, несмотря на флаг "g", sed не вставляет ' *' между одной парой запятых?
Ответы:
Потому что с двумя ,s (,\)\(,\), вы уже сопоставили первые два ,s, и шаблон Regex, сопоставленный до сих пор, не будет возвращаться для остальной части строки. Теперь остался только один, который является последним, ,следовательно, он просто печатается так, как будто *между ними нет второго, последнего.
Если у вас есть другой ,вход, вы получите желаемый (глобальный g) ответ:
% echo ,,,, | sed s':\(,\)\(,\):\1*\2:'g
,*,,*,
echo ,,,,, |sed s':\(,\)\(,\):\1*:’g
На вопрос почему @heemayl уже ответил
Обходной путь sed(здесь предполагается GNU sed) - рекурсивный цикл, пока найдено совпадение
$ echo ,,, | sed -E ':a s/(,)(,)/\1*\2/ ; ta'
,*,*,
$ echo ,,,, | sed -E ':a s/(,)(,)/\1*\2/ ; ta'
,*,*,*,
POSIXly:
$ echo ,,,, | sed -e :a -e 's/\(,\)\(,\)/\1*\2/; ta'
,*,*,*,
Или с perl
$ echo ,,, | perl -pe 's/,\K(?=,)/*/g'
,*,*,
$ echo ,,,, | perl -pe 's/,\K(?=,)/*/g'
,*,*,*,
sиgвыходить из кавычек?)