UNIX में टैब टैब करें


417

मैं grepयूनिक्स प्लेटफॉर्म पर फाइलों में टैब (\ t) कैसे करूं ?


53
बस उपयोग करें grep "<Ctrl+V><TAB>", यह काम करता है (यदि पहली बार: टाइप करें grep "तो Ctrl + V कुंजी कॉम्बो दबाएं, फिर TAB कुंजी दबाएं, फिर टाइप करें "और एंटर दबाएं, voilà!)
rook

16
ctrl + v एक बहुत बुरा विचार है! ... हाँ, यह कंसोल कमांड से काम कर सकता है, लेकिन यह SCRIPT में इसे टाइप करने के लिए काम नहीं कर सकता है (आप संपादक की दया पर हैं, उदाहरण के लिए मैं इसमें mcedit और ctrl + v DON'T काम का उपयोग करता हूं)
THESorcerer

संबंधित, लेकिन कोई डुप्लिकेट नहीं : टैब के लिए खोजें, बिना -P, 'grep' का उपयोग करके
पीटर मॉर्टेंसन

इसे भी देखें: askubuntu.com/questions/53071/… (नीचे के रूप में अच्छी तरह से जुड़ा हुआ है)
shiri

जवाबों:


374

यदि GNU grep का उपयोग कर रहे हैं, तो आप Perl-शैली regexp का उपयोग कर सकते हैं:

grep -P '\t' *

यह मेरे पैटर्न के खिलाफ काम नहीं करता है। उस सिंटैक्स का उपयोग करने का प्रयास कुछ भी नहीं छापता है। (क्या मैक ओएस एक्स वेरिएंट अलग है?)
Futureelite7

2
@futureelite: Apple के डॉक्स ( developer.apple.com/Mac/library/documentation/Darwin/Reference/… ) के अनुसार, मैक OS X grep प्रोग्राम को -P विकल्प का समर्थन करना चाहिए। Superuser.com पर एक नया प्रश्न बनाने पर विचार करें।
खोलना

3
यह GNU UNIX के लिए बहुत अच्छा है, लेकिन POSIX Solaris, AIX और HP-UX के बारे में क्या? उन लोगों को -Pविकल्प के बारे में कुछ भी पता नहीं है ।
बदमाश

21
@ ग्रोक जीएनयू का यूनिक्स नहीं है।
लिली चुंग

5
मैक OSX में आप पैटर्न का उपयोग करके दे सकते हैं -e
फैसल फिरोज

314

चाल एकल उद्धरण से पहले $ साइन का उपयोग करना है । यह कट और अन्य उपकरणों के लिए भी काम करता है ।

grep $'\t' sample.txt

7
जीवन रक्षक टिप जीवन बचाता है! यह zshउतना ही काम करता है , जितना मैं बता सकता हूं। क्या आप इस पर टिप्पणी कर सकते हैं कि उस $चिन्ह का शब्दार्थ क्या है?
रोमेन

2
यदि स्ट्रिंग में '\ t' के अलावा कुछ भी नहीं है तो काम नहीं करता है। आप उदाहरण के लिए "\ t" (टैब + स्पेस) की खोज कैसे करेंगे?
रमन

6
रमन: आप उपयोग कर सकते हैं $'\t'' '। एक वास्तविक उदाहरण जो दिखाता है कि यह श के साथ भी काम करता है (न केवल बैश, जो डिफ़ॉल्ट रूप से एंड्रॉइड पर स्थापित नहीं है) busybox grep -oE '^nodev'$'\t''fuse$' /proc/filesystems
v6ak

5
मुझे लगता है कि $ '...' एक बैश मुहावरा है। शायद श में काम नहीं करता है। डनो csh या tcsh के बारे में।
एडवर्ड फॉक

5
'मैन बैश' से: फॉर्म के शब्द 'स्ट्रिंग' को विशेष रूप से व्यवहार किया जाता है। यह शब्द ANSI C मानक द्वारा निर्दिष्ट बैकस्लैश-एस्कैप्ड वर्णों के साथ स्ट्रिंग में फैलता है। बैकस्लैश एस्केप सीक्वेंस, अगर मौजूद हैं, तो डिकोड हो जाते हैं ...
ब्रूनेई

84

मैं कभी भी grep के साथ 't' मेटाचैकर का काम करने में कामयाब नहीं हुआ। हालाँकि मुझे दो वैकल्पिक समाधान मिले:

  1. <Ctrl-V> <TAB>Ctrl (V का उपयोग करके तब टाइपिंग टैब को दबाकर)
  2. Awk का उपयोग करना: foo | awk '/\t/'

4
| awk '/\t/'समाधान सभी के गोले, प्लेटफार्मों और प्रणालियों के लिए काम करेंगे।
सामवेन

6
पोर्टेबल POSIX समाधान के लिए +1 और बशीज़, ज़िशिज्म, GNUism और linuxism का उपयोग नहीं कर रहा है।
जेन्स

1
यदि आप कॉपी-पेस्ट करना चाहते हैं (अपने नोट्स या स्क्रिप्ट से) तो ctrl-V उपयोगी नहीं है। बेहतर स्पष्ट समाधान का उपयोग करें जिसमें एक दृश्यमान 't' हो, शाब्दिक TABs (जैसे कि व्हॉट्सएप की तरह दिखने वाले) अक्सर
नकल

awkयहाँ अच्छी तरह से काम करता है, लेकिन बहुत बड़ी फ़ाइलों के साथ मेरी मशीन पर कुछ परीक्षणों में यह उपयोग करने की तुलना में लगभग 30% धीमा है grep -P। यह उपयोग के मामले के आधार पर तुच्छ और अप्रासंगिक हो सकता है, और awkपठनीयता और पोर्टेबिलिटी के लिए बेहतर हो सकता है।
theferrit32

43

उबंटू के इस जवाब से :

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

grep -P "\t" <file name>

शाब्दिक टैब वर्ण का उपयोग करें:

grep "^V<tab>" <filename>

printfआपके लिए एक टैब वर्ण मुद्रित करने के लिए उपयोग करें :

grep "$(printf '\t')" <filename>

1
से शब्दशः http://askubuntu.com/a/53096/453741
villapx

यदि आप कॉपी-पेस्ट करना चाहते हैं (अपने नोट्स या स्क्रिप्ट से) तो ctrl-V उपयोगी नहीं है। बेहतर स्पष्ट समाधान का उपयोग करें, जिसमें एक दृश्यमान 't' हो, शाब्दिक TAB (यानी व्हॉट्सएप की तरह दिखने वाले) अक्सर SPC में परिवर्तित हो जाते हैं जब
मैथुन

31

एक तरीका है (यह बैश के साथ है)

grep -P '\t'

-P Perl नियमित अभिव्यक्तियों को चालू करता है, इसलिए \ t काम करेगा।

जैसा कि उपयोगकर्ता बताते हैं, यह GNU grep के लिए विशिष्ट हो सकता है। वैकल्पिक रूप से शाब्दिक रूप से वहां एक टैब सम्मिलित करना है यदि शेल, संपादक या टर्मिनल इसे अनुमति देगा।


Ksh शेल में अज्ञात P विकल्प
सचिन चौरसिया

जैसा कि कहा जाता है, GNU grep के लिए विशिष्ट हो सकता है। सिर्फ स्पष्ट किया।
tjmoore 11:

आप टैब कैसे जोड़ते हैं? जब आप टैब बटन दबाते हैं तो क्या यह स्वतः पूर्ण प्रक्रिया शुरू नहीं करता है? (जो बाश स्क्रिप्ट में काम कर सकता है, लेकिन कमांड लाइन में नहीं)
एंटोनियो सी एस

1
@AntonioCS जैसा कि ऊपर SamKrieg ने नोट किया है, शेल में आपको कोई भी वर्ण टाइप करने के लिए, बस CTRL-v टाइप करें। यह भी देखें askubuntu.com/questions/53071/…
डेनिस अरनॉड

2
-पीआरई के लिए विशिष्ट है, किसी भी शेल के लिए नहीं। -पी को किसी भी शेल में काम करना चाहिए, बशर्ते कि GNU grep स्थापित हो
plijnzaad

13

भाव के अंदर टैब को शाब्दिक रूप से सम्मिलित करने का एक और तरीका है, $'\t'जो बैश में कम-ज्ञात उद्धरण का उपयोग कर रहा है :

grep $'foo\tbar'        # matches eg. 'foo<tab>bar'

(ध्यान दें कि यदि आप निश्चित तारों के लिए मिलान कर रहे हैं तो आप इसे '-F' मोड के साथ उपयोग कर सकते हैं।)

कभी-कभी चर का उपयोग करके संकेतन को थोड़ा अधिक पठनीय और प्रबंधनीय बनाया जा सकता है:

tab=$'\t'               # `tab=$(printf '\t')` in POSIX
id='[[:digit:]]\+'
name='[[:alpha:]_][[:alnum:]_-]*'
grep "$name$tab$id"     # matches eg. `bob2<tab>323`

10

यह ठीक वैसा नहीं है जैसा आप देख रहे हैं, बल्कि आपके मामले में काम कर सकता है

grep '[[:blank:]]'

के बराबर

grep -P '[ \t]'

इसलिए इसमें स्पेस और टैब मिलेगा।

§ चरित्र वर्ग

ध्यान दें, यह मेरे में विज्ञापित नहीं है man grep, लेकिन फिर भी काम करता है

$ आदमी grep | ग्रेप खाली | स्वागत
      ० ० ०

@ A-letubby यह अब संपादन के साथ काम करता है - -Pतर्क जोड़ा गया।
विलापएक्स

6

आपके लिए टैब सम्मिलित करने के लिए इको का उपयोग करें grep "$(echo -e \\t)"


6

मूल रूप से इसे संबोधित करने के दो तरीके हैं:

  1. ( अनुशंसित ) grep द्वारा समर्थित नियमित अभिव्यक्ति सिंटैक्स का उपयोग करें (1)। आधुनिक grep (1) POSIX के दो रूपों का समर्थन करता है 1003.2 regex वाक्यविन्यास: मूल (अप्रचलित) RES, और आधुनिक REs। सिंटैक्स को re_format (7) और regex (7) मैन पेजों पर विवरण में वर्णित किया गया है जो क्रमशः BSD और Linux सिस्टम का हिस्सा हैं। GNU grep (1) भी पर्ल-संगत आरईएस का समर्थन करता है जैसा कि pcre (3) लाइब्रेरी द्वारा प्रदान किया गया है।

    रेगेक्स भाषा में टैब प्रतीक आमतौर पर \tपरमाणु द्वारा एन्कोड किया जाता है। परमाणु बीएसडी द्वारा समर्थित है नियमित अभिव्यक्ति बढ़ाया ( egrep, grep -Eबीएसडी संगत सिस्टम पर), और साथ ही पर्ल-संगत आर ई (pcregrep , जीएनयू grep -P)।

    मूल नियमित अभिव्यक्ति और लिनक्स विस्तारित आरईएस दोनों का स्पष्ट समर्थन नहीं है \t । कृपया यह जानने के लिए कि यह किस भाषा का समर्थन करता है UNIX उपयोगिता मैन पेज से परामर्श करें (इसलिए sed (1), awk (1) और pcregrep (1) नियमित अभिव्यक्ति के बीच का अंतर)।

    इसलिए, लिनक्स पर:

    $ grep -P '\t' FILE ...
    

    BSD के समान सिस्टम पर:

    $ egrep '\t' FILE ...
    $ grep -E '\t' FILE ...
    
  2. टैब कैरेक्टर को पैटर्न में पास करें। जब आप किसी स्क्रिप्ट फ़ाइल को संपादित करते हैं तो यह सीधा है:

    # no tabs for Python please!
    grep -q '   ' *.py && exit 1
    

    हालांकि, जब एक इंटरैक्टिव शेल में काम करते हैं तो आपको लाइन में उचित प्रतीक टाइप करने के लिए शेल और टर्मिनल क्षमताओं पर भरोसा करने की आवश्यकता हो सकती है। अधिकांश टर्मिनलों पर यह Ctrl+ Vकुंजी संयोजन के माध्यम से किया जा सकता है जो टर्मिनल को अगले इनपुट चरित्र का शाब्दिक रूप से इलाज करने का निर्देश देता है (यह V"शब्दशः" के लिए है):

    $ grep '<Ctrl>+<V><TAB>' FILE ...
    

    कुछ शेल कमांड टाइपिंग के लिए उन्नत समर्थन की पेशकश कर सकते हैं। इस तरह, बाश (1) में $'string'विशेष रूप से शब्दों का व्यवहार किया जाता है:

    bash$ grep $'\t' FILE ...
    

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

    बॉर्न शेल के लिए (और न केवल) एक ही व्यवहार को उचित रेगेक्स का निर्माण करने के लिए प्रिंटफ (1) द्वारा संवर्धित कमांड प्रतिस्थापन का उपयोग करके अनुकरण किया जा सकता है:

    $ grep "`printf '\t'`" FILE ...
    

4

grep "$(printf '\t')" मैक ओएस एक्स पर मेरे लिए काम किया


2

gawk का उपयोग करें, फ़ील्ड सीमांकक को टैब (\ t) पर सेट करें और फ़ील्ड की संख्या की जाँच करें। यदि 1 से अधिक है, तो टैब हैं / हैं

awk -F"\t" 'NF>1' file

2
यह थोड़ा अधिक है, और सवाल याद करता है। awk /\t/ऑप के प्रश्न के लिए पर्याप्त है।
सीमित प्रायश्चित

2

एक अच्छा विकल्प 'sed as grep' का उपयोग करना है (जैसा कि इस शास्त्रीय sed ट्यूटोरियल में बताया गया है )।

sed -n 's/pattern/&/p' file

उदाहरण (बाश, श, क्ष, षष्ट में काम करता है ..):

[~]$ cat testfile
12 3
1 4 abc
xa      c
        a       c\2
1 23

[~]$ sed -n 's/\t/&/p' testfile 
xa      c
        a       c\2

[~]$ sed -n 's/\ta\t/&/p' testfile
        a       c\2

1

+1 रास्ता, जो ksh, डैश, आदि में काम करता है: TAB डालने के लिए प्रिंटफ का उपयोग करें:

grep "$(printf 'BEGIN\tEND')" testfile.txt

इसने उबंटू ट्रस्टी (बैश 4.3.11) पर मेरे लिए काम नहीं किया, निम्नलिखित ने हालांकि काम किया:grep "$(printf '\t')" testfile.txt
जोश रंबुट

0

इसका उत्तर सरल है। अपना grep लिखें और बोली के भीतर टैब कुंजी टाइप करें, यह कम से कम ksh में अच्छी तरह से काम करता है

grep "  " *

3
सबसे पहले आपको अपने शेल में एक TAB वर्ण इनपुट करने की आवश्यकता है - अधिकांश शेल इस कुंजी को एक कमांड (पूर्णता) के रूप में व्याख्या करते हैं
काई


0

'Sed-as-grep' विधि का उपयोग करना, लेकिन व्यक्तिगत पसंद के दृश्यमान चरित्र के साथ टैब को बदलना मेरा पसंदीदा तरीका है, क्योंकि यह स्पष्ट रूप से दिखाता है कि दोनों फाइलों में अनुरोधित जानकारी शामिल है, और यह भी कि इसे लाइनों के भीतर कहां रखा गया है:

sed -n 's/\t/\*\*\*\*/g' file_name

यदि आप लाइन / फ़ाइल जानकारी, या अन्य grep विकल्पों का उपयोग करना चाहते हैं, लेकिन टैब वर्ण के लिए दृश्यमान प्रतिस्थापन देखना चाहते हैं, तो आप इसे प्राप्त कर सकते हैं

grep -[options] -P '\t' file_name | sed 's/\t/\*\*\*\*/g'

उदहारण के लिए:

$ echo "A\tB\nfoo\tbar" > test
$ grep -inH -P '\t' test | sed 's/\t/\*\*\*\*/g'
test:1:A****B
test:2:foo****bar

संपादित करें: स्पष्ट रूप से उपरोक्त केवल टैब को खोजने के लिए फ़ाइल सामग्री को देखने के लिए उपयोगी है --- यदि उद्देश्य एक बड़े स्क्रिप्टिंग सत्र के भाग के रूप में टैब को संभालना है, तो यह किसी भी उपयोगी उद्देश्य की सेवा नहीं करता है।


0

यह AIX के लिए अच्छा काम करता है। मैं युक्त पंक्तियों को खोज रहा हूंJOINED<\t>ACTIVE

voradmin cluster status | grep  JOINED$'\t'ACTIVE

 vorudb201   1       MEMBER(g) JOINED        ACTIVE
*vorucaf01   2       SECONDARY JOINED        ACTIVE

0

आप उपयोग करना चाह सकते हैं grep "$(echo -e '\t')"

केवल आवश्यकता है echoबैकस्लैश पलायन की व्याख्या करने में सक्षम होना।


0

ये वैकल्पिक बाइनरी पहचान विधियां पूरी तरह कार्यात्मक हैं। और, मुझे वास्तव में किसी के जागने का उपयोग करना पसंद है, क्योंकि मैं सिंगल बाइनरी चार्ट के साथ वाक्यविन्यास के उपयोग को काफी याद नहीं कर सकता। हालाँकि, POSIX पोर्टेबल फैशन (यानी TAB = echo "@" | tr "\100" "\011") में शेल वैरिएबल को एक मान प्रदान करना संभव है , और फिर इसे हर जगह से POSIX पोर्टेबल फैशन में नियोजित करना चाहिए; साथ ही (यानी grep "$ TAB" फ़ाइल नाम)। जबकि यह समाधान TAB के साथ अच्छी तरह से काम करता है, यह अन्य बाइनरी वर्णों को भी अच्छी तरह से काम करेगा, जब असाइनमेंट में एक और वांछित बाइनरी मान का उपयोग किया जाता है (इसके बजाय TAB वर्ण के लिए मान के लिए 'tr')।


0

अन्य उत्तरों में दी गई $ 't' संकेतन शेल-विशिष्ट है - यह बाश और zsh में काम करता है, लेकिन सार्वभौमिक नहीं है।

नोट: निम्नलिखित fishशेल के लिए है और बैश में काम नहीं करता है :

में fishखोल, एक एक गैर उद्धृत उपयोग कर सकते हैं \tउदाहरण के लिए,:

grep \t foo.txt

या एक हेक्स या यूनिकोड संकेतन का उपयोग कर सकते हैं जैसे:

grep \X09 foo.txt
grep \U0009 foo.txt

(ये नोटेशन अधिक गूढ़ चरित्रों के लिए उपयोगी हैं)

चूँकि इन मूल्यों को निर्विवादित किया जाना चाहिए, इसलिए किसी को अवतरण के द्वारा उद्धृत और अयोग्य मानों को जोड़ सकते हैं:

grep "foo"\t"bar"

-4

आपको लिखना आता है

grep \ t फू

या

grep '\ t' फू

फ़ाइल foo में टैब वर्ण के लिए खोज करने के लिए। आप शायद अन्य एस्केप कोड भी कर सकते हैं, हालांकि मैंने केवल \ n परीक्षण किया है। हालाँकि यह समय लेने वाली है, और स्पष्ट नहीं है कि आप क्यों करना चाहते हैं, zsh में आप टैब वर्ण भी टाइप कर सकते हैं, शुरुआत में वापस आ सकते हैं, grep कर सकते हैं और उद्धरण के साथ टैब संलग्न कर सकते हैं।


-6

कई बार रिक्त स्थान देखें [[: space:]] *

grep [[: space:]] * '।' ''

कुछ इस तरह मिलेगा:

'सारणी' ..

ये एकल कोटेशन (') हैं, और दोहरे नहीं हैं (")।
यह है कि आप कैसे grep =" में संक्षिप्तिकरण करते हैं। "

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