2011-02-10 68 views
2

我使用perl來檢查正則表達式模式的一些文本輸入,但是有一種模式不適用於perl -peperl -pe正則表達式問題

以下模式不與命令調用工作:

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

我用的是Linux外殼。以下調用我用它來測試我的正則表達式:

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

我怎樣才能刪除第一個結果?

感謝您的任何建議。

+0

您正在使用什麼殼呢?你的意見是什麼?你的預期產出是多少? – 2011-02-10 14:47:58

+0

添加了信息。 – CSchulz 2011-02-10 14:51:35

+0

什麼是古怪的反斜線八進制 - 呃,我的意思是**非八進制** - gunk那裏?當然,看起來像一個編碼問題給我! – tchrist 2011-02-10 15:13:33

回答

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
3

「Comp - (。*)」之後的最後一個斜槓可能是做什麼的。 「數據庫」中的文件內容沒有斜槓。嘗試用Comp-(.*)[/.].*替換Comp-(.*)/.*,以便您可以匹配子目錄或文件擴展名。

1

問題出在正則表達式中的最後一個斜槓字符。而不是轉義點,它只是正常的斜槓字符,它從輸入字符串中缺少。試試這個:

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

編輯:更新以匹配新的輸入數據,並添加另一種選擇:

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

在另一方面,你替換正則表達式可以通過類似更換

然後,不需要解析包含它的任何內容。

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