簡體   English   中英

perl Multiline查找並用正則表達式替換

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM