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}