заменить несколько совпадений подстроки их индексами - PullRequest
0 голосов
/ 14 февраля 2020

при условии, что у вас есть строка с несколькими вхождениями одной и той же подстроки, что будет лучшим однострочником, чтобы заменить совпадения другой подстрокой, которая также содержит индекс математики? Например, предположим, что у вас есть следующая строка: This is a test., и мы хотим заменить все вхождения is на X, а их индекс будет иметь что-то вроде: ThX-0 X-1 a test.

Любые идеи на этом?

Ответы [ 3 ]

1 голос
/ 14 февраля 2020

Простое решение в awk будет:

awk '{while(sub(/[iI][Ss]/,"X-"count++)){a=""};count=""} 1' Input_file

ИЛИ согласно комментарию сэра Анубхавы, добавив приведенную выше более короткую версию кода:

awk '{while(sub(/[iI][Ss]/,"X-"count++));count=""} 1'  Input_file

Простое объяснение будет, запустить al oop до тех пор, пока не будет найдена подстановка и буквально ничего не делать внутри нее :) напечатать строку наконец.

1 голос
/ 14 февраля 2020

Perl на помощь!

echo 'This is a test.' | perl -pe 's/is/"X-" . $c++/ge' 
  • -p читает строку ввода построчно, запускает код и выводит обработанную строку.
  • s///g выполняет замену глобально, т. Е. На всех позициях, где это возможно
  • /e интерпретирует заменяющую часть как код и запускает ее. Здесь код использует оператор конкатенации . для строки X- и значение $c, увеличивая его на единицу одновременно.
0 голосов
/ 14 февраля 2020

Вот один альтернативный вариант gnu-awk с одним вкладышем:

echo 'This is a test.' | awk -v RS='[iI][sS]' '{ORS = "X-" i++} 1'

ThX-0 X-1 a test.

Чтобы сбросить счетчик для каждой строки:

printf '%s\n%s\n' 'This is a test.' 'This is another this' |
awk -v RS='[iI][sS]' '/\n/{i=0} {ORS = "X-" i++} 1'

ThX-0 X-1 a test.
ThX-0 X-1 another thX-2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...