शाब्दिक टैब का उपयोग किए बिना टैब के लिए grep कैसे करें और क्यों काम नहीं करता है?


146

जब मैं (e) grep के साथ फाइल में टैब खोजता हूं तो मैं लिटिरल टैब ( ^v + <tab>) का उपयोग करता हूं । मैं \tनियमित अभिव्यक्ति में टैब के प्रतिस्थापन के रूप में उपयोग नहीं कर सकता । उदाहरण के लिए sed के साथ यह अभिव्यक्ति बहुत अच्छी तरह से काम करती है।

तो क्या गैर-लिबरल प्रतिस्थापन का उपयोग करने की कोई संभावना है <tab>और गैर-कामकाजी / व्याख्या नहीं की गई पृष्ठभूमि क्या हैं \t?


जवाबों:


206

POSIX द्वारा परिभाषित के रूप में grep नियमित अभिव्यक्ति का उपयोग कर रहा है । जिन कारणों से POSIX को \tटैब के रूप में परिभाषित नहीं किया गया है।

आपके पास कई विकल्प हैं:

  • बताएं कि पेरेल द्वारा परिभाषित नियमित अभिव्यक्तियों का उपयोग करने के लिए grep (पर्ल \tटैब के रूप में है):

    grep -P "\t" foo.txt

    मैन पेज चेतावनी देता है कि यह एक "प्रयोगात्मक" सुविधा है। कम से कम \tठीक काम करने लगता है। लेकिन अधिक उन्नत पर्ल रेगेक्स सुविधाएँ नहीं हो सकती हैं।

  • आपके लिए टैब वर्ण प्रिंट करने के लिए प्रिंटफ़ का उपयोग करें:

    grep "$(printf '\t')" foo.txt
  • शाब्दिक टैब वर्ण का उपयोग करें:

    grep "^V<tab>" foo.txt

    वह है: टाइप करें grep ", फिर दबाएं ctrl+v, फिर दबाएं tab, फिर टाइप करें " foo.txtctrl+vटर्मिनल में दबाने से अगली कुंजी को शब्दशः लिया जाता है। इसका मतलब है कि टर्मिनल टैब कुंजी से बंधे कुछ फ़ंक्शन को ट्रिगर करने के बजाय एक टैब वर्ण सम्मिलित करेगा।

  • bash के asi c quoting सुविधा का उपयोग करें :

    grep $'\t' foo.txt

    यह सभी गोले में काम नहीं करता है।

  • awk का उपयोग करें:

    awk '/\t/'
  • sed का उपयोग करें:

    sed -n '/\t/p'

POSIX और अन्य प्रणालियों में परिभाषित वर्ण वर्गों के अवलोकन के लिए नियमित अभिव्यक्ति के बारे में विकिपीडिया लेख देखें ।


एनज़ोटिब के उत्तर पर आधारित मुझे निम्नलिखित जोड़ने दें: grep $'\t' foo.txt(लेकिन मैं आमतौर पर fgrepइसके बजाय grep
लिखूंगा

मुझे इसकी आवश्यकता थी, एक पर्यावरण चर के मूल्य के साथ संयुक्त। मैंने इस्तेमाल किया grep "$(printf '\t')${myvar}" foo.txt। यह ठीक काम किया। कुछ कोशिशों के साथ, मुझे काम करने का अंतिम रूप नहीं मिला।
sancho.s

1
क्या कोई कारण है कि सादा grepचुपचाप \tटैब के रूप में व्याख्या नहीं कर सकता है ? क्या POSIX की आवश्यकता है कि \tइसका मतलब कुछ और है? शायद यह केवल एक शाब्दिक मैच के बाद माना जाता \ है t?
हारून मैकडैड

शायद ध्यान देने योग्य बात यह है कि बीएसडी (OSX सहित) grep में -P विकल्प का अभाव है।
टेक्सगीक

आदमी पृष्ठ से This is highly experimental and grep -P may warn of unimplemented features.शायद -Pविरासत प्रणालियों में उपयोग करने के लिए एक अच्छा विचार नहीं है । printfविकल्प बेहतर है
Avindra Goolcharan

13

यह बिल्कुल ऐसा जवाब नहीं है जिसे आप सुनना चाहते हैं, लेकिन बैश द्वारा एस्केप सीक्वेंस का एक संभावित उपयोग प्रदान किया जाता है

command | grep $'\t'

(इसे दोहरे उद्धरण चिह्नों में मत डालें!)।


1
-ई की कोई आवश्यकता नहीं है (जो खोजा गया है वह रेगेक्स नहीं है)। कमांड से पाइप करने की भी आवश्यकता नहीं है। उस ने कहा, बैश की यह काफी अनदेखी विशेषता ($ से पहले एकल-उद्धृत स्ट्रिंग्स) को इंगित करने के लिए धन्यवाद
वाल्टर ट्रॉस

2
दरअसल, मेरा सुझाव है कि @enzotib बस होने का जवाब संपादित करें grep $'\t'
तेमू लीस्टी

यह जोर दिया जाना चाहिए कि यह बैश और इच्छाशक्ति की एक विशेषता है (चुपचाप!) गलत काम करते हैं यदि कुछ अन्य शेल (जैसे डैश, जो उबंटू और अन्य पर शेल स्क्रिप्ट के लिए डिफ़ॉल्ट है) द्वारा निष्पादित किया जाता है
xjcl


हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.