Цикл выполнения СЭД с / РЕГЭКСП / ЗАМЕНА / г


14

Почему echo ,,, |sed s':\(,\)\(,\):\1*\2:'gуступает " ,*,,", а не " ,*,*,"? Другими словами: почему, несмотря на флаг "g", sed не вставляет ' *' между одной парой запятых?

Ответы:


14

Потому что с двумя ,s (,\)\(,\), вы уже сопоставили первые два ,s, и шаблон Regex, сопоставленный до сих пор, не будет возвращаться для остальной части строки. Теперь остался только один, который является последним, ,следовательно, он просто печатается так, как будто *между ними нет второго, последнего.

Если у вас есть другой ,вход, вы получите желаемый (глобальный g) ответ:

% echo ,,,, | sed s':\(,\)\(,\):\1*\2:'g
,*,,*,

Что за странная цитата? (Зачем уходить sи gвыходить из кавычек?)
GnP

@ GNP Ха-ха, это унаследовано от ОП.
Heemayl

илиecho ,,,,, |sed s':\(,\)\(,\):\1*:’g
njboot

8

На вопрос почему @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'
,*,*,*,
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.