[英]Replacing first and second occurrence of the same text with different values
[英]Replacing first occurrence of a wildcard string in text file
我试图用TENANT1_PDB1
中的以下模式用TENANT1_PDB1
替换首次出现的ZOWG628UT7PQCWQ_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)) )
像*
和+
正则表达式量词是贪婪的,这意味着如果它们可以匹配更多,它们将会匹配。 要使它们“非贪婪”,请添加?
在量词之后。
在您的情况下,将模式更改为.*?_PDB1
应该仅更改每行中的第一个匹配项(如果有)。
您的正则表达式有一些问题,当您说.*_PDB1
,它会进行贪心匹配并替换所有内容,直到最后一次匹配为止。 您可以使用: perl -p -i.bak -e 's/.*_PDB1 /TENANT1_PDB1/' filename.txt
。 请注意,我在_PDB1
之后添加了一个空格。
或者,您也可以进行惰性匹配perl -p -i.bak -e 's/.*?_PDB1/TENANT1_PDB1/' filename.txt
必须通过某些正则表达式锚点或类集来更严格地限制匹配搜索
perl -pi -e 's/^\w+(_PDB1)/TENANT1$1/'
或s/\\b\\w+(_PDB1)/TENANT1$1/
或您认为更好的任何内容,请参见https://perldoc.perl.org/perlre.html
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.