Цикл виконання sed s / REGEXP / ЗАМІНА / g


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.