[英]perl Multiline Find and Replace with regex
我有一個屬性文件test.properties
,其內容如下所示:
#DEV
#jms_value=devdata.example
#TST
#jms_value=tstdata.example
#DEV
#ems_value=emsdev.example
我想根據文件所在的環境取消注釋環境名稱下的行。
文件是否進入DEV環境。 我需要取消所有“ #DEV”下的行的注釋。 我使用了以下命令:
perl -i -p -e 's/#DEV\n#(.*)/#DEV\n\1/g;' test.properties
這不會更改文件中的任何內容。
誰能幫助我找到解決方案?
只需將變量用作標志即可。 如果看到#DEV
,請將其設置為1,否則將其設置為0。如果設置了標志,則刪除#DEV
的#
-但在設置標志之前檢查標志!
perl -pe 's/^#// if $delete; $delete = /^#DEV$/;' input-file
一種方法是從perlrun doc中提取整個文件
特殊值00將使Perl在段落模式下提取文件。 任何0400或更高的值都將使Perl吞噬整個文件,但是按照慣例,0777是通常用於此目的的值。
我對示例輸入進行了一些修改,以進行演示:
$ cat ip.txt
#DEV
#jms_value=devdata.example
#TST
#jms_value=tstdata.example
#DEV
#ems_value=emsdev.example
xyz #DEV
#abc
在OP的正則表達式中添加-0777
選項
$ perl -0777 -pe 's/#DEV\n#(.*)/#DEV\n\1/g' ip.txt
#DEV
jms_value=devdata.example
#TST
#jms_value=tstdata.example
#DEV
ems_value=emsdev.example
xyz #DEV
abc
如果#DEV
只需要#DEV
匹配,請使用m
標志
$ perl -0777 -pe 's/^#DEV\n#(.*)/#DEV\n\1/mg' ip.txt
#DEV
jms_value=devdata.example
#TST
#jms_value=tstdata.example
#DEV
ems_value=emsdev.example
xyz #DEV
#abc
也可以使用正向后看:
$ perl -0777 -pe 's/^#DEV\n\K#//mg' ip.txt
#DEV
jms_value=devdata.example
#TST
#jms_value=tstdata.example
#DEV
ems_value=emsdev.example
xyz #DEV
#abc
另請注意: Perl正則表達式中\\ 1和$ 1有什么區別?
您可以嘗試如下操作:
perl -pe'if ($a==1) {s/^#//;$a=0;} $a=1 if (/^#DEV/)'
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.