Почему 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
выходить из кавычек?)