2011-12-29 13 views
23

के माध्यम से खोज से विशिष्ट निर्देशिकाओं को बहिष्कृत करें ack के साथ RegEx के माध्यम से मैं विशिष्ट निर्देशिकाओं को कैसे अनदेखा करूं?एएसी: regex

मैं --ignore-dir विकल्प का उपयोग कर सकता हूं, लेकिन यह मुझे RegEx निर्दिष्ट करने नहीं देता है। मैं किसी भी निर्देशिका को अनदेखा करने में सक्षम होना चाहता हूं, जिसमें test या tests या उसके नाम पर अधिक जटिल पैटर्न हैं।

मैं भी माध्यम से

ack -G '(?<!test)' pattern 

एक नकारात्मक lookbehind कोशिश की, लेकिन यह काम नहीं करता। यह test निर्देशिकाओं को बाहर नहीं करता है।

$ ack pattern -G 'test|tests' --invert-file-match 

खैर, यह एक तरह से प्रलेखित है:

उत्तर

20

अप्रलेखित विकल्प "--invert-फ़ाइल-मैच" (: 1.96 अपने सिस्टम पर पावती संस्करण) का प्रयोग करें

$ ack --help|grep invert 
-v, --invert-match Invert match: select non-matching lines 
--invert-file-match Print/search handle files that do not match -g/-G. 

यह अपने perldoc में दस्तावेज नहीं है।

+0

बहुत बढ़िया - धन्यवाद!मैन पेज में इसके बारे में कुछ भी नहीं, मैं या तो देख रहा हूं, लेकिन यह काम करता है। – AmigoNico

5

एक के पूर्व 1.96 संस्करण (मेरे जैसे) का उपयोग करके लोगों के हित में, आप इसे करने के लिए रेगेक्स लुक का उपयोग कर सकते हैं। यहाँ एक उदाहरण है:

ack --java 'text-pattern' -G '^((?!(test|target)).)*$' 

यह रिकर्सिवली सभी Java फाइलों में text-pattern खोज करेंगे कि शब्द test या target उनके रास्ते में नहीं है (से।)।

+0

यह निर्माण क्या करता है '^ ((?! (परीक्षण | लक्ष्य))। * * $' मतलब? – Scit

10

ack2 के साथ, ऐसा लगता है you can't use holygeek's solution.

यहाँ कैसे मैं इसे -v और -x का उपयोग कर करेंगे: एक regex dirs को बाहर करने के लिए

+1

वास्तव में एके 2 के लिए, यह वही है जो आप चाहते हैं। धन्यवाद! – igniteflow

2

में

ack -v -g 'test' | ack -x pattern 

आम तौर पर, 'test' किया जा सकता है एके के हाल के संस्करण, आप --ignore-dir के साथ नियमित अभिव्यक्तियों का उपयोग कर सकते हैं।

this thread से:

हाँ, 2.15_01 में हम कहा:

  • पावती अब --ignore-dir = मैच का समर्थन करता है: .... धन्यवाद, Ailin Nemui! (GitHub टिकट # 42)

GitHub लिंक: https://github.com/petdance/ack2/issues/42

दुख की बात है, मैं आधार निर्देशिका का नाम, नहीं पूरा पथ मिलान यह केवल का समर्थन करता है लगता है।

उदाहरण के लिए, आप ".*/docs/generated/.*" जैसे पथ से मेल नहीं खा सकते हैं।

इसके लिए, (अभी भी खुला) GitHub issue 291 देखें।