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