perl oneliner 在预期匹配后替换任何东西
perl oneliner substitutes anything after intended matching
我有这个文件test
(大括号之间的行数可以变化几行):
\Email{test}
\Adresse{tes \
test \
test}
\Gruss{test}
我想要的:
\Email{test}
\Adresse{}
\Gruss{test}
但是 suggested solutionperl -i -pe 'BEGIN{undef $/;} s/\Adresse.*}/\Adresse{}/smg' test
将文本转换为
\Email{}
\Adresse{}
\Gruss{}
并删除 \Gruss{test}
。我怎样才能防止这种行为?
编辑 以澄清:我想保留\Adresse{} 前后的整个文本。此外,我的 "real file" 上提供的解决方案之一存在一些问题,因此我改进了对问题的描述。
您可以尝试使用 "non-greedy" 匹配结合 /s
正则表达式修饰符来匹配换行符与 .
。此外,您可以将 BEGIN{undef $/;}
替换为 -0
选项:
perl -0 -pe 's/{.*?}/{}/sg' test
可以试试
perl -0 -pe 's/(\Adresse\{).*?}/}/sg'
来自
\Adresse{tes
test
test}
\Gruss{test}
生产
\Adresse{}
\Gruss{test}
来自
\Email{test}
\Adresse{tes \
test \
test}
\Gruss{test}
生产
\Email{test}
\Adresse{}
\Gruss{test}
我有这个文件test
(大括号之间的行数可以变化几行):
\Email{test}
\Adresse{tes \
test \
test}
\Gruss{test}
我想要的:
\Email{test}
\Adresse{}
\Gruss{test}
但是 suggested solutionperl -i -pe 'BEGIN{undef $/;} s/\Adresse.*}/\Adresse{}/smg' test
将文本转换为
\Email{}
\Adresse{}
\Gruss{}
并删除 \Gruss{test}
。我怎样才能防止这种行为?
编辑 以澄清:我想保留\Adresse{} 前后的整个文本。此外,我的 "real file" 上提供的解决方案之一存在一些问题,因此我改进了对问题的描述。
您可以尝试使用 "non-greedy" 匹配结合 /s
正则表达式修饰符来匹配换行符与 .
。此外,您可以将 BEGIN{undef $/;}
替换为 -0
选项:
perl -0 -pe 's/{.*?}/{}/sg' test
可以试试
perl -0 -pe 's/(\Adresse\{).*?}/}/sg'
来自
\Adresse{tes
test
test}
\Gruss{test}
生产
\Adresse{}
\Gruss{test}
来自
\Email{test}
\Adresse{tes \
test \
test}
\Gruss{test}
生产
\Email{test}
\Adresse{}
\Gruss{test}