Если Perl
- ваш вариант, попробуйте:
word="MANAGER"
replacement="PLANET.SUN.STAR"
perl -pe "s/(?<=${word}\(')(.+?)(?='\))/${replacement}/" <<< "DEF QR('xxx.yyy.sss') USE(YES) DESC('Something') MANAGER('SUN') NAME('CAT') TRASMIT('TRUCK') REPLACE"
, который выдает:
DEF QR('xxx.yyy.sss') USE(YES) DESC('Something') MANAGER('PLANET.SUN.STAR') NAME('CAT') TRASMIT('TRUCK') REPLACE
- Регулярное выражение
(?<=${word}\(')
- это утверждение, которое нужно сопоставить1010 *. - Регулярное выражение
(?='\))/
является предварительным утверждением, совпадающим с ')
. - Регулярное выражение
(.+?)
между ними является шаблоном, подлежащим замене.
Не думаю, что вам нужно присваивать SUN
переменную только для целей замены, но если вам это нужно, изменение кода легко.
EDIT
Вот обновленная версия с предположением о требовании OP.
perl -pe "s/(?<=MANAGER\(')(.+?)(?='\))/PLANET.\$1.STAR/" text
Входной текст:
DEF QR('xxx.yyy.sss') USE(YES) DESC('Something') MANAGER('SUN') NAME('CAT') TRASMIT('TRUCK') REPLACE
DEF QR('xxx.yyy.sss') USE(YES) DESC('Something') MANAGER('MOON') NAME('CAT') TRASMIT('TRUCK') REPLACE
DEF QR('xxx.yyy.sss') USE(YES) DESC('Something') MANAGER('JUPITER') NAME('CAT') TRASMIT('TRUCK') REPLACE
Вывод:
DEF QR('xxx.yyy.sss') USE(YES) DESC('Something') MANAGER('PLANET.SUN.STAR') NAME('CAT') TRASMIT('TRUCK') REPLACE
DEF QR('xxx.yyy.sss') USE(YES) DESC('Something') MANAGER('PLANET.MOON.STAR') NAME('CAT') TRASMIT('TRUCK') REPLACE
DEF QR('xxx.yyy.sss') USE(YES) DESC('Something') MANAGER('PLANET.JUPITER.STAR') NAME('CAT') TRASMIT('TRUCK') REPLACE
- Прежде всего, давайте сосредоточимся на части
MANAGER('blah')
и разделим строку на три части: MANAGER('
, blah
и ')
. - Регулярное выражение
(?<=MANAGER\(')
соответствует 1-мукусок.Регулярное выражение (?<=pattern)
называется положительным взглядом нулевой ширины за утверждением .Он работает как якорь , а соответствующая строка не включена в группу захвата.Природа полезна для повторного использования исходной подстроки (1-й кусок) без влияния. - Регулярное выражение
(?='\))
соответствует 3-му элементу.Регулярное выражение (?=pattern)
является положительным утверждением нулевой ширины , которое аналогично 1-му. - Регулярное выражение
(.+?)
соответствует подстроке, окруженной 1-м регулярным и 3-модин.?
после квантификатора +
вызывает кратчайшее совпадение , в противном случае регулярное выражение будет пытаться найти максимально возможное совпадение за границами слова. - Новое, давайте перейдем к ЗАМЕНЕчасть.Мы хотим добавить
PLANET.
перед захваченным словом и добавить .STAR
после слова.Захваченное слово можно отнести к $1
, тогда запасная часть будет выглядеть как PLANET.\$1.STAR
.Обратная косая черта необходима, потому что скрипт находится в двойных кавычках.
В качестве альтернативы приведена версия AWK
, которая дает тот же результат:
awk -v q=\' '$0=gensub("(MANAGER\\(" q ")([^" q "]+)(" q "\\))", "\\1PLANET.\\2.STAR\\3", "g")' text
Надеюсь, что это соответствует требованию.