Как заменить каждое энное возникновение шаблона с помощью sed ТОЛЬКО

Я искал на всем протяжении сети, но я не могу найти хорошие решения. Я считал на многих форумах это sed не инструмент (но awk ) для этого, но это не имеет никакого смысла мне почему. Я подразумеваю, что можно сделать простую замену на возникновение номер 5, например, как: sed 's/pattern/replace/5' заменять только 5-й экземпляр. Почему не может sed сделать 's/pattern/replace/<every 5th occur>' для одной строки? Не то, что основная функция..

Так или иначе моя проблема состоит в том, что программное обеспечение нашего клиента работает на среде окон, которая ограничила функции Linux и к сожалению awk не доступно в системе. Установка новых команд НЕ является опцией для компании по любой причине.

Таким образом, мой вопрос, что состоит в том, чтобы использовать лучший способ sed и/или смешанный с ударом для замены каждого энного возникновения шаблона на строку? У меня только есть одна строка так или иначе, когда я уже разделил все символы новой строки. Удар for циклично выполнить единственный путь?

0
задан 24 March 2018 в 01:36

2 ответа

Не то, что основная функция..

Очевидно, это не. Но это все еще возможно:

sed 's/a\([^a]*\($\|a[^a]*\($\|a[^a]*\($\|a[^a]*\($\|a\)\)\)\)\)/A\1/g'

Более читаемый с -r где мы можем отбросить обратные косые черты:

sed -r 's/a([^a]*($|a[^a]*($|a[^a]*($|a[^a]*($|a)))))/A\1/g' 

т.е. a, сопровождаемый любым количеством не -a, сопровождаемый или к концу строки или к другому a, сопровождаемый любым количеством не -a, и т.д. Все после первого a в помнят \1.

BTW, если Perl доступен, можно использовать:

perl -pe 'BEGIN { @A = qw(a A) } s/a/$A[not $i++ % 5]/g'

% оператор по модулю. $i увеличен с каждым соответствием, отрицание модуля равняется 1, 0, 0, 0, 0, 1, и т.д., который использовал в качестве индекса в выборы @A корректное a или A.

4
ответ дан 30 October 2019 в 05:02

Простой sed и расширение фигурной скобки:

sed '-es/pattern/replace/'{max..min..step} infile

замените макс. числом> =number случаев шаблона, если Вы не знаете, что, установите его как наибольшее число символов в самой длинной строке в Вашем файле.


$ sed '-es/a/A/'{20..1..5} <<<"aaaa aaaa   a a a aa a a a aa aa"
aaaa Aaaa   a A a aa a A a aa aA

Для замены первого вхождения также используйте ниже:

$ sed '-es/a/A/'{{20..1..5},1} <<<"aaaa aaaa   a a a aa a a a aa aa"
Aaaa Aaaa   a A a aa a A a aa aA
3
ответ дан 30 October 2019 в 05:02

Другие вопросы по тегам:

Похожие вопросы: