我有一个属性文件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
这不会改变文件中的任何内容。
有人可以帮我找到解决方案吗?
答案 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