Чому 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
виходити з лапок?)