我正在尝试使用文件中的以下模式将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)) )
答案 0 :(得分:2)
像*
和+
这样的正则表达式量词是贪婪的,这意味着如果它们可以匹配更多,它们将会匹配。要使它们“非贪婪”,请在量词后添加?
。
对于您而言,将模式更改为.*?_PDB1
只能更改每行中的第一个匹配项(如果有的话)。
答案 1 :(得分:1)
您的正则表达式有一个问题,当您说.*_PDB1
时,它会进行贪婪的匹配并替换所有内容,直到最后一次匹配为止。
您可以申请:perl -p -i.bak -e 's/.*_PDB1 /TENANT1_PDB1/' filename.txt
。请注意,我在_PDB1
之后添加了一个空格。
或者您也可以进行惰性匹配perl -p -i.bak -e 's/.*?_PDB1/TENANT1_PDB1/' filename.txt
答案 2 :(得分:0)
必须通过某些正则表达式锚点或类集来更严格地限制匹配搜索
perl -pi -e 's/^\w+(_PDB1)/TENANT1$1/'
或s/\b\w+(_PDB1)/TENANT1$1/
或您认为更好的任何内容,请参见https://perldoc.perl.org/perlre.html