Замена первого вхождения строки подстановки в текстовом файле - PullRequest
0 голосов
/ 11 апреля 2019

Я пытаюсь заменить первое вхождение ZOWG628UT7PQCWQ_PDB1 на TENANT1_PDB1 в приведенном ниже шаблоне, который есть в файле.

ZOWG628UT7PQCWQ_PDB1 = (description= (address=(host=slc12ebg)) (connect_data=(service_name=ZOWG628UT7PQCWQ_PDB1_low.xyz.com)) (security=(ssl_server_cert_dn="CN=adwc-dev.uscom-east-1.xyz.com,OU=Testing Domain,O=End Point)) )

Обратите внимание, что ZOWG628UT7PQCWQ - это переменная в строке, которая будет изменяться и ZOWG628UT7PQCWQ_PDB1 необходимо заменить на TENANT1_PDB1.

Я пытался perl -pi -e 's/.*_PDB1/TENANT1_PDB1/' filename.txt, но он заменяет до второго появления ZOWG628UT7PQCWQ_PDB и выдает следующий вывод, который не требуется:

TENANT1_PDB1_low.xyz.com)) (security=(ssl_server_cert_dn="CN=adwc-dev.uscom-east-1.xyz.com,OU=Testing Domain,O=End Point)) )

Мне нужен вывод как:

TENANT1_PDB1 = (description= (address=(host=slc12ebg)) (connect_data=(service_name=ZOWG628UT7PQCWQ_PDB1_low.xyz.com)) (security=(ssl_server_cert_dn="CN=adwc-dev.uscom-east-1.xyz.com,OU=Testing Domain,O=End Point)) )

Ответы [ 3 ]

2 голосов
/ 11 апреля 2019

Кванторы Regex, такие как * и +, являются жадными, то есть, если они могут соответствовать больше, они будут.Чтобы сделать их «не жадными», добавьте ? после квантификатора.

В вашем случае изменение шаблона на .*?_PDB1 должно изменить только первое вхождение (если оно есть) в каждой строке,

1 голос
/ 11 апреля 2019

У вашего регулярного выражения есть некоторая проблема, когда вы говорите .*_PDB1, он идет на жадное совпадение и заменяет все до последнего совпадения. Вы можете пойти на: perl -p -i.bak -e 's/.*_PDB1 /TENANT1_PDB1/' filename.txt. Пожалуйста, обратите внимание, я добавил один пробел после _PDB1.

Или вы также можете пойти на ленивый поиск perl -p -i.bak -e 's/.*?_PDB1/TENANT1_PDB1/' filename.txt

0 голосов
/ 11 апреля 2019

должно быть более ограничено поиском совпадений с помощью некоторого якоря регулярных выражений или набора классов

perl -pi -e 's/^\w+(_PDB1)/TENANT1$1/'

или s/\b\w+(_PDB1)/TENANT1$1/, или как вы считаете, лучше увидеть https://perldoc.perl.org/perlre.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...