perl -pe正则表达式问题

时间:2011-02-10 14:41:15

标签: regex perl

我使用perl检查正则表达式模式的一些文本输入,但是一种模式不适用于perl -pe

以下模式不适用于命令调用:

s![a-zA-Z]+ +(?:.*?)/(?:.*)Comp-(.*)/.*!$1!

我使用的是linux shell。接下来我用来测试我的正则表达式:

cat test | perl -pe 's![a-zA-Z]+ +(?:.*?)/(?:.*)Comp-(.*)/.*!$1!'

文件测试:

A   MaintanceGie?\195?\159mannFlock/System/Comp-Database.cpp
A   MaintanceGie?\195?\159mannFlock/System/Comp-Cache/abc.h

结果:

A   MaintanceGie?\195?\159mannFlock/System/Comp-Database.cpp
Cache

如何删除第一个结果?

感谢您的任何建议。

4 个答案:

答案 0 :(得分:3)

在“Comp - (。*)”之后的最后一次斜线可能是正在做的事情。 “数据库”中的文件内容没有斜杠。尝试将Comp-(.*)/.*替换为Comp-(.*)[/.].*,以便您可以匹配子目录或文件扩展名。

答案 1 :(得分:2)

$ cat input 
A   MaintanceGie?\195?\159mannFlock/System/Comp-Database.cpp
A   MaintanceGie?\195?\159mannFlock/System/Comp-Cache/abc.h

$ perl -ne 'print if s![a-zA-Z]+ +(?:.*?)/(?:.*)Comp-(.*)/.*!$1!' input
Cache

答案 2 :(得分:1)

问题在于正则表达式中的最后一个斜杠字符。它不是转义点,而是正常的斜杠字符,输入字符串中缺少该字符。试试这个:

s![a-zA-Z]+ +(?:.*?)/(?:.*)Comp-(.*)[./].*!$1!

修改:已更新以匹配新输入数据并添加了另一个选项:

另一方面,您的替换正则表达式可能会被替换为:

perl -ne 'print "$1\n" if /Comp-(.*?)[.\/]/'

然后就不需要用它包含的任何东西来解析整行。

答案 3 :(得分:1)

\ s匹配空格(空格,制表符和换行符),“+”表示一个或多个字符。在这种情况下,'\ s +'意味着搜索一个或多个空格。

cat test
A   MaintanceGie?\195?\159mannFlock/System/Comp-Database.cpp
A   MaintanceGie?\195?\159mannFlock/System/Comp-Cache/abc.h

perl -ne 'print "$1\n" if /\w+?\d+?\d+\w+\/\w+\/Comp-(\w+)[\/]/' test