开发者

perl -pe regex problem

I use perl to check some text input for a regex pattern, but one pattern doesn't work with perl -pe.

Following pattern doesn't work with the command call:

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

I use the linu开发者_开发技巧x shell. Following call I use to test my regex:

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

File test:

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

Result:

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

How can I remove the first result?

Thanks for any advice.


That last slash after "Comp-(.*)" may be what's doing it. Your file content in the "Database" doesn't have a slash. Try replacing Comp-(.*)/.* with Comp-(.*)[/.].* so you can match either the subdirectory or the file extension.


$ 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


The problem is in last slash character in the regex. Instead of escaping the dot, it is just normal slash character, which is missing from input string. Try this:

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

Edit: Updated to match new input data and added another option:

On the other hand, your replacement regex might be replaced by something like:

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

Then there is no need to parse full line with whatever it contains.


\s match whitespace (spaces, tabs, and line breaks) and '+' means one or more characters. In this case '\s+' would mean search for one or more whitespaces.

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
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜