Если регулярное выражение вкус поддерживает \ K и \ G, это легко сделать такую замену, используя выражение как
's/(\G|"rec_rec_three": ")[^"]*?\K-/_/g
\G
означает ссылку на конец предыдущего матча, и \K
устанавливает эффективное начало текущее совпадение с положением, в котором оно происходит. Обратите внимание, что (по крайней мере, в Perl) это должна быть первая операция совпадения для данной строковой переменной. В противном случае \ G может быть унаследован от предыдущего. (См http://www.regular-expressions.info/continue.html подробности)
Простой тест:
> cat testfile
"rec_rec_three": "tini-bikini-martini"
"rec_rec_one": "tini-bikini-martini" "rec_rec_two": "tini-bikini-martini" "rec_rec_three": "tini-bikini-martini" "rec_rec_four": "tini-bikini-martini"
> cat testfile | perl -n -e 's/(\G|"rec_rec_three": ")[^"]*?\K-/_/g;print'
"rec_rec_three": "tini_bikini_martini"
"rec_rec_one": "tini-bikini-martini" "rec_rec_two": "tini-bikini-martini" "rec_rec_three": "tini_bikini_martini" "rec_rec_four": "tini-bikini-martini"
Мессинга с JSON? :) Каков ваш аромат регулярного выражения? Попробуйте ['(?:" Rec_rec_three ": \ s *" | (?! ^) \ G) \ K ([^ "-] *) -'] (https://regex101.com/r/pN8rU6/1), заменяя '$ 1_'. –
Какую цель? Чтобы заменить символы _value_ '' '' на '_'? – sln
Самый быстрый и простой способ - просто совместить '(" rec_rec_three ": \ s *") ([^ "] +) (? =") 'Использовать группу захвата обратного вызова 1 с нормальной заменой строки' -' с '_' из группы захвата 2. Если у вас есть конструкция' \ K' в вашем движке, вы можете полностью игнорировать группы. '" rec_rec_three ": \ s *" \ K [^ "] + (? =") '. Но используя что-либо с этим сценарием '(? <= ....). * (? = ..)' может вызвать проблемы с обратным трассировкой, если конечный литерал не найден. – sln