繁体   English   中英

替换文本文件中首次出现的通配符字符串

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM