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

时间:2019-04-11 09:54:15

标签: regex perl replace

我正在尝试使用文件中的以下模式将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 个答案:

答案 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