2011-02-08 10 views
2

ここでは簡単なシナリオで私の問題があります。Linuxで無駄なマッチを使用する正規表現を見つける

いくつかのテストファイルを作成します。

touch /tmp/test.xml  
touch /tmp/excludeme.xml  
touch /tmp/test.ini  
touch /tmp/test.log 

私は私のすべてのXMLおよびINIファイルを返す式探している:

[[email protected]] ~> find /tmp -name -prune -o -regex '.*\.\(xml\|ini\)'  
/tmp/test.ini  
/tmp/test.xml  
/tmp/excludeme.xml  

を私は今、除外するように、この-regexを変更する方法をしたいですexcludeme.xmlファイルが結果に含まれないようにします。

これは、無駄な正規表現(?=expr)と否定の一致(?!expr)を組み合わせて使用​​することで可能になるはずです。残念ながら、コマンドの形式を正しく取得することはできません。そのため、試行は返されません。私はfindコマンドとして(例えばgrep -vを通すこと)は、複数のステップにコマンドを打破することはできません

find /tmp -name -prune -o -regex '\(?=.*excludeme\.xml\).*\.\(xml\|ini\)' 

:ここに私の試みの一つ(!私は別のエスケープでこれの多くの異なる形を試してみた)でした私たちのツールの他の部分への入力として想定されています。これは、あなたがLinux上で何をしたいん

答えて

3

: "!" 私はわからないんだけど

find /tmp -name -prune -o -regex '.*\.\(xml\|ini\)' \! -regex '.*excludeme\.xml' 

場合演算子はgnu findに固有です。

+0

これは私にとって完璧に動作します、ありがとう! –

0

ない前後参照が動作している場合、あなたが必要とするか、またはエスケープが、Perlのためにこれらの作業内容について確認してください:

/^(?!.*\/excludeme\.).*\.(xml|ini)$/

/(?<!\/excludeme)\.(xml|ini)$/

編集が - ちょうどあなたがでできる最善、findコマンドをチェックしますfindはregextypeを-regextype posix-extendedに変更することですが、それは見た目のようなものではありません。この問題を回避するには、@unholygeekがfindまたはpipingで-p perlオプションを指定してgnu grepを見つけるようにgnuを使う方法があります。 gnu grepを使う場合は上記の正規表現をそのまま使用することができます。何かのようにfind .... -print | xargs grep -P ...

申し訳ありません、私はできることは最高です。

+0

私はこれらの式をエスケープ時のさまざまな試行で試しましたが、見つけた正規表現で動作させることができませんでした。 :-( –

関連する問題