如何使用 Perl 替换包含字符 '/' 和换行符的多行?

蕨类植物

我正在尝试修改几个文件中的几行块。最初,我尝试了 sed,但读到 Perl 可能是更好的选择。但是,我的 Perl 非常基础,我不确定如何处理空(新)行和特殊字符“/”。总而言之,我想要一个像 ( $perl -i -pe ...) 这样的单线来转换

(new line)
#include <item_b/item_bC.h>

进入

#include <item_a/item_aC.h>
#include <item_b/item_bC.h>

谢谢。

一种方法 - 将文件放入字符串中,然后匹配仅可能有空格的行,后跟以 开头的行#include...,并替换与该#include匹配的内容两次

perl -0777 -wpe's{ ^\s*\n ( \#include.*\n ) }{$1$1}mxg' file.c

-0777它吸食整个文件到$_-p它打印$_一个每一行(一旦当用于-0777自HTE整个文件是在$_这样有一个这样的“线”); 请参阅perlrun 中的开关所述/m改性剂品牌^(和$)也是一个(多)字符串内匹配线边界。

或者,以相同的一般方法(吞咽文件)但使用前瞻

perl -0777 -wpe's{ ^\s*\n (?= (\#include.*\n) ) }{$1}mxg' file.c

匹配一个空行,然后先行查找以 开头的行#include,该也被捕获,以便用它替换空行。由于环视不消耗任何东西,因此无需替换该行(用它自己)。

请注意,这.*是贪婪的并且尽可能多地匹配它.*\n后面的模式,这里我们在它前面有整个文件,所以它可能看起来会一直匹配到\n文件中的最后一个但是,.不匹配换行符(带有/s修饰符),因此.*\n此处在第一个换行符处停止,因此它与该行的其余部分匹配。

如果需要匹配更具体的包含语句,请按照#include模式添加详细信息

否则,可以逐行处理,通过复制当前行并在下一行打印,具体取决于保存的和下一行的内容。那里有一些挑剔的细节需要整理,而不是超级适合单线。

都用输入测试 file.c

    
#include<item_b/item_bC.h> 
#include<item_a/item_aC.h> 

#include<item_c/item_cC.h> 

int main() { 

    return 1; 
}

我们最终得到两个item_b、一个item_a和两个itewm_c包含且没有空行,文件的其余部分不受影响。


提到了特殊字符,所以我会发表评论。但请参考更完整的资源,如教程perlretut和参考perlre另见perlrebackslash

正则表达式的特殊字符在使用\. 但在这种情况下,这不是必需的:/在正则表达式中的作用只是分隔模式,通常以 给出/.../,但在这里我{}{}用作分隔符;所以/这里没什么特别的,可以自由使用。例如

perl -0777 -wpe's{ ^\s*\n (?= (\#include<item_./.*\n) ) }{$1}mxg' file.c

匹配我使用的输入文件中的行,如上所示。

显然有一个更通用的模式而不是item实际问题,它是一个文件名。文件名中允许的大多数字符都可以在正则表达式中直接使用。例外,比如.,可以被转义,比如\.匹配一个文字.

例如,一个字符串item_bC.h,其中bC的字符而变化,但是item.h总是相同的,可以用模式匹配/item_..\.h/

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何替换包含空格和引号的字符串?

替换包含换行符的字符串

如何使用Shell或Perl替换包含正则表达式元字符的字符串?

如何防止Perl替换仅Unix的换行符?

如何使用.replace()替换包含按位运算符的字符串部分

使用“ sed”替换包含“”和\的文件

如何在Perl中的字符串中包含换行符?

如何用雪花中的空格替换包含字母和特殊字符的行

正则表达式:如何拆分和替换包含数字的字符串?

如何在 LibreOffice Calc 中查找和替换包含通配符的字符串?

如何用 sed 命令替换包含日期和 IP 的字符串

是否可以使用 shell 命令查找和替换包含单个字符的行?

在大文件中替换包含换行符的字符串

responseText包含多余的空格字符(换行符,换行符),如何在jsp中防止和删除它们?

如何在VBA中使用RegEx进行多行任何字符匹配,包括换行符

如何使用sed替换包含括号的字符串

使用MySQL搜索和替换添加换行符

sed替换包含换行符的文本

如何使用 Perl 从文件末尾删除换行符

使用JavaScript解析换行符,空格和“ \”字符

使用换行符和制表符替换sed / awk字符串

如何替换包含冰岛语字符的字符串?

使用sed替换包含特殊字符的字符串

使用sed替换包含引号和单引号的文本

如何在Python中替换字符串中的连字符和换行符

Python Pandas:如何替换包含“?”的字符串

如何用sed替换包含斜杠的字符串?

如何替换包含方括号的字符串

在Powershell中,如何替换包含问号的字符串?