用 SED 或 PERL 单行匹配并替换多个换行符

2024-04-26

我有一个输入 C 文件 (myfile.c),如下所示:

void func_foo();
void func_bar();

//supercrazytag

我想使用 shell 命令插入新的函数原型,这样输出就变成:

void func_foo();
void func_bar();
void func_new();

//supercrazytag

到目前为止,我还没有成功使用 SED 或 PERL。 什么不起作用:

sed 's|\n\n//supercrazytag|void func_new();\n\n//supercrazytag|g' < myfile.c
sed 's|(\n\n//supercrazytag)|void func_new();\1|g' < myfile.c

使用与 perl -pe "....." 相同的模式也不起作用。

我缺少什么?我尝试了很多不同的方法,包括this https://stackoverflow.com/questions/1164925/match-any-character-including-newlines-in-sed and this https://stackoverflow.com/questions/1251999/sed-how-can-i-replace-a-newline-n/1252191#1252191 and that https://stackoverflow.com/questions/1577057/sed-find-pattern-over-two-lines-not-replace-after-that-pattern.


对于“perl -pe”,您的问题是它正在逐行处理,因此它无法找到“\n\n”。如果你向 Perl 添加 -0777 标志(使其立即处理整个文件),它将起作用:

perl -0777 -pe "s|(\n\n//supercrazytag)|\nvoid func_new();$1|g" myfile.c

我还将(不建议使用此用法)\1 更改为 $1,并在替换的开头添加了一个额外的“\n”以提高可读性。

See perlrun(命令开关) http://perldoc.perl.org/perlrun.html#Command-Switches对于看起来奇怪的“-0777”的解释

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

用 SED 或 PERL 单行匹配并替换多个换行符 的相关文章

随机推荐