2011-09-23 61 views
2

我有這個表達式:匹配的一切,但一個特定的單詞

.*js/[\bpackaged\b]+\.js 

在它從下面的列表匹配 'packaged.js' 的時刻:

  • JS/foo.js
  • JS/bar.js
  • JS/suitcase.js
  • JS/bootstrap.js
  • JS/packaged.js

我怎樣才能反轉這一點,以便它所有的其他比賽除了「packaged.js」?

+1

請注意,您的模式也匹配「js/ppppppp.js」。 –

回答

3
kent$ echo " js/foo.js 
    js/bar.js 
    js/suitcase.js 
    js/bootstrap.js 
    js/packaged.js 
"|grep -P '.*js/.*(?<!packaged).js' 

    js/foo.js 
    js/bar.js 
    js/suitcase.js 
    js/bootstrap.js 

該示例僅顯示錶達式,如果真的使用grep,-v可以使其更容易。

--- 更新基於glibdud的評論 ---

通知的最後5行中輸入:

kent$ echo " js/foo.js 
    js/bar.js                                
    js/suitcase.js                              
    js/bootstrap.js                              
    js/packaged.js 
    js/foo_packaged.js 
    js/packaged_bar.js 
    js/foo_packaged_bar.js 
    js/_packaged.js 
    js/packaged_.js"|grep -P '.*js/(.+packaged\.js|.+(?<!packaged)\.js)' 

輸出:

js/foo.js 
    js/bar.js 
    js/suitcase.js 
    js/bootstrap.js 
    js/foo_packaged.js 
    js/packaged_bar.js 
    js/foo_packaged_bar.js 
    js/_packaged.js 
    js/packaged_.js 
+0

如果我正確地閱讀它,這將匹配任何文件名,它的基數不會與「封裝」結尾。換句話說,它也不能匹配「foopackaged.js」。不過,很好的例子。對於OP的目的可能足夠好。 – glibdud

+0

@glibdud查看我的更新回答 – Kent

+1

好的解決方案,儘管我認爲您需要將第一個「。+」更改回「。*」,否則它將無法匹配「封裝」前面有單個字母(例如「js/apackaged.js」) – glibdud

0

這你想要做什麼:

.*js/(?!packaged\.js).+\.js