perl Multiline查找和替换正则表达式

时间:2016-10-05 21:36:37

标签: regex perl multiline

我有一个属性文件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

这不会改变文件中的任何内容。

有人可以帮我找到解决方案吗?

3 个答案:

答案 0 :(得分:1)

只需使用变量作为标志。如果看到#DEV,则将其设置为1,否则将其设置为0.如果设置了标志,则删除前导# - 但在设置之前检查标志!

perl -pe 's/^#// if $delete; $delete = /^#DEV$/;' input-file

答案 1 :(得分:1)

一种方法是从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必须仅在行首处匹配,请使用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


另请注意: What is the difference between \1 and $1 in a Perl regex?

答案 2 :(得分:0)

您可以尝试这样的事情:

self.bounds