LINUX.ORG.RU

sed: заменить первые n вхождений в строке

 , ,


0

3

Доброй ночи. Никак не могу реализовать сабж. Вроде пересмотрел все флаги sed, из нужных нашел только Num и g

c:\nncron>echo abracadabraaa | sed -e "s/a/b/5"
abracadabrbaa

c:\nncron>echo abracadabraaa | sed -e "s/a/b/5g"
abracadabrbbb

c:\nncron>echo abracadabraaa | sed -e "s/a/b/g"
bbrbcbdbbrbbb

Странно, что во флагах нельзя использовать отрицание, как перед функцией !s например 5!g, !5, но то есть заменить первые 5 вхождений в строку или все, кроме 5-го.

Может быть через рекурсию или как-то по-другому можно сделать это?


если нужен именно sed, то можно костыльнуть sed -e 's/a/b/g' -e s'/b/a/g{NUM+1}'

вообще это можно сделать на чем-нибудь другом(awk например) цикликом, чтобы точно работало

f1u77y ★★★★
()

Может быть через рекурсию или как-то по-другому можно сделать это?

можно s/../../<num> '\n' в строку встроить, затем что-то вроде «s/^\([^\n]*\)a/\1b/» с рекурсией - но это изврат

anonymous
()
Ответ на: комментарий от anonymous

А остальные переводы строк игнорятся этим regexp? Как это происходит?

xseed
() автор топика
Ответ на: комментарий от anonymous

Получается строка обрабатывается тремя regexp как непрерывный поток и учитываются только переводы строк, по которым найдены вхождения?

xseed
() автор топика
Ответ на: комментарий от anonymous

Благодарю. А если усложнить задачу? Если нужно заменить вхожденния с 5 по 10. А также все, кроме 5-го. sed-ом можно организовать подобное?

xseed
() автор топика
Ответ на: комментарий от anonymous
sed -e 's/a/b/' -e 's/a/b/' -e 's/a/b/' -e 's/a/b/' -e 's/a/b/'

блин, ну почему у sed нет рекурсии со счетчиком?

sed -e 's/a/\n/5g' -e 's/a/b/g' -e 's/\n/a/g'

кстати, «a» может в общем случае являться регулярным выражением, как тогда быть с 's/\n/a/g'?

xseed
() автор топика

Вот уже в течение 325 серий пассажирский самолёт xseed-747 терпит крушение над океаном говнокода на sed. Экипаж лайнера отважно борется за спасение жизни пассажиров.

anonymous
()
Ответ на: комментарий от anonymous

Океана-то и не видно, вы пока единственный, кто более-менее удачный пример привели. А если awk?

xseed
() автор топика

Может быть через рекурсию

Вы знаете, как реализовать рекурсию на Седе?

или как-то по-другому можно сделать это?

Да, без малейших сомнений можно — задача-то элементарная — возьмите любой нормальный язык — и сделаете.

Zmicier ★★★★★
()
Последнее исправление: Zmicier (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.