मैं grep
यूनिक्स प्लेटफॉर्म पर फाइलों में टैब (\ t) कैसे करूं ?
मैं grep
यूनिक्स प्लेटफॉर्म पर फाइलों में टैब (\ t) कैसे करूं ?
जवाबों:
यदि GNU grep का उपयोग कर रहे हैं, तो आप Perl-शैली regexp का उपयोग कर सकते हैं:
grep -P '\t' *
-P
विकल्प के बारे में कुछ भी पता नहीं है ।
चाल एकल उद्धरण से पहले $ साइन का उपयोग करना है । यह कट और अन्य उपकरणों के लिए भी काम करता है ।
grep $'\t' sample.txt
zsh
उतना ही काम करता है , जितना मैं बता सकता हूं। क्या आप इस पर टिप्पणी कर सकते हैं कि उस $
चिन्ह का शब्दार्थ क्या है?
$'\t'' '
। एक वास्तविक उदाहरण जो दिखाता है कि यह श के साथ भी काम करता है (न केवल बैश, जो डिफ़ॉल्ट रूप से एंड्रॉइड पर स्थापित नहीं है) busybox grep -oE '^nodev'$'\t''fuse$' /proc/filesystems
।
मैं कभी भी grep के साथ 't' मेटाचैकर का काम करने में कामयाब नहीं हुआ। हालाँकि मुझे दो वैकल्पिक समाधान मिले:
<Ctrl-V> <TAB>
Ctrl (V का उपयोग करके तब टाइपिंग टैब को दबाकर)foo | awk '/\t/'
| awk '/\t/'
समाधान सभी के गोले, प्लेटफार्मों और प्रणालियों के लिए काम करेंगे।
awk
यहाँ अच्छी तरह से काम करता है, लेकिन बहुत बड़ी फ़ाइलों के साथ मेरी मशीन पर कुछ परीक्षणों में यह उपयोग करने की तुलना में लगभग 30% धीमा है grep -P
। यह उपयोग के मामले के आधार पर तुच्छ और अप्रासंगिक हो सकता है, और awk
पठनीयता और पोर्टेबिलिटी के लिए बेहतर हो सकता है।
उबंटू के इस जवाब से :
बताएं कि पेरेल द्वारा परिभाषित नियमित अभिव्यक्ति का उपयोग करने के लिए grep (पर्ल
\t
टैब के रूप में है):grep -P "\t" <file name>
शाब्दिक टैब वर्ण का उपयोग करें:
grep "^V<tab>" <filename>
printf
आपके लिए एक टैब वर्ण मुद्रित करने के लिए उपयोग करें :grep "$(printf '\t')" <filename>
एक तरीका है (यह बैश के साथ है)
grep -P '\t'
-P
Perl नियमित अभिव्यक्तियों को चालू करता है, इसलिए \ t काम करेगा।
जैसा कि उपयोगकर्ता बताते हैं, यह GNU grep के लिए विशिष्ट हो सकता है। वैकल्पिक रूप से शाब्दिक रूप से वहां एक टैब सम्मिलित करना है यदि शेल, संपादक या टर्मिनल इसे अनुमति देगा।
भाव के अंदर टैब को शाब्दिक रूप से सम्मिलित करने का एक और तरीका है, $'\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`
यह ठीक वैसा नहीं है जैसा आप देख रहे हैं, बल्कि आपके मामले में काम कर सकता है
grep '[[:blank:]]'
के बराबर
grep -P '[ \t]'
इसलिए इसमें स्पेस और टैब मिलेगा।
ध्यान दें, यह मेरे में विज्ञापित नहीं है man grep
, लेकिन फिर भी काम करता है
$ आदमी grep | ग्रेप खाली | स्वागत ० ० ०
-P
तर्क जोड़ा गया।
मूल रूप से इसे संबोधित करने के दो तरीके हैं:
( अनुशंसित ) 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 ...
टैब कैरेक्टर को पैटर्न में पास करें। जब आप किसी स्क्रिप्ट फ़ाइल को संपादित करते हैं तो यह सीधा है:
# 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 ...
gawk का उपयोग करें, फ़ील्ड सीमांकक को टैब (\ t) पर सेट करें और फ़ील्ड की संख्या की जाँच करें। यदि 1 से अधिक है, तो टैब हैं / हैं
awk -F"\t" 'NF>1' file
awk /\t/
ऑप के प्रश्न के लिए पर्याप्त है।
एक अच्छा विकल्प '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 रास्ता, जो ksh, डैश, आदि में काम करता है: TAB डालने के लिए प्रिंटफ का उपयोग करें:
grep "$(printf 'BEGIN\tEND')" testfile.txt
grep "$(printf '\t')" testfile.txt
'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
संपादित करें: स्पष्ट रूप से उपरोक्त केवल टैब को खोजने के लिए फ़ाइल सामग्री को देखने के लिए उपयोगी है --- यदि उद्देश्य एक बड़े स्क्रिप्टिंग सत्र के भाग के रूप में टैब को संभालना है, तो यह किसी भी उपयोगी उद्देश्य की सेवा नहीं करता है।
आप उपयोग करना चाह सकते हैं grep "$(echo -e '\t')"
केवल आवश्यकता है echo
बैकस्लैश पलायन की व्याख्या करने में सक्षम होना।
ये वैकल्पिक बाइनरी पहचान विधियां पूरी तरह कार्यात्मक हैं। और, मुझे वास्तव में किसी के जागने का उपयोग करना पसंद है, क्योंकि मैं सिंगल बाइनरी चार्ट के साथ वाक्यविन्यास के उपयोग को काफी याद नहीं कर सकता। हालाँकि, POSIX पोर्टेबल फैशन (यानी TAB = echo "@" | tr "\100" "\011"
) में शेल वैरिएबल को एक मान प्रदान करना संभव है , और फिर इसे हर जगह से POSIX पोर्टेबल फैशन में नियोजित करना चाहिए; साथ ही (यानी grep "$ TAB" फ़ाइल नाम)। जबकि यह समाधान TAB के साथ अच्छी तरह से काम करता है, यह अन्य बाइनरी वर्णों को भी अच्छी तरह से काम करेगा, जब असाइनमेंट में एक और वांछित बाइनरी मान का उपयोग किया जाता है (इसके बजाय TAB वर्ण के लिए मान के लिए 'tr')।
अन्य उत्तरों में दी गई $ 't' संकेतन शेल-विशिष्ट है - यह बाश और zsh में काम करता है, लेकिन सार्वभौमिक नहीं है।
नोट: निम्नलिखित fish
शेल के लिए है और बैश में काम नहीं करता है :
में fish
खोल, एक एक गैर उद्धृत उपयोग कर सकते हैं \t
उदाहरण के लिए,:
grep \t foo.txt
या एक हेक्स या यूनिकोड संकेतन का उपयोग कर सकते हैं जैसे:
grep \X09 foo.txt
grep \U0009 foo.txt
(ये नोटेशन अधिक गूढ़ चरित्रों के लिए उपयोगी हैं)
चूँकि इन मूल्यों को निर्विवादित किया जाना चाहिए, इसलिए किसी को अवतरण के द्वारा उद्धृत और अयोग्य मानों को जोड़ सकते हैं:
grep "foo"\t"bar"
आपको लिखना आता है
grep \ t फू
grep '\ t' फू
फ़ाइल foo में टैब वर्ण के लिए खोज करने के लिए। आप शायद अन्य एस्केप कोड भी कर सकते हैं, हालांकि मैंने केवल \ n परीक्षण किया है। हालाँकि यह समय लेने वाली है, और स्पष्ट नहीं है कि आप क्यों करना चाहते हैं, zsh में आप टैब वर्ण भी टाइप कर सकते हैं, शुरुआत में वापस आ सकते हैं, grep कर सकते हैं और उद्धरण के साथ टैब संलग्न कर सकते हैं।
कई बार रिक्त स्थान देखें [[: space:]] *
grep [[: space:]] * '।' ''
कुछ इस तरह मिलेगा:
'सारणी' ..
ये एकल कोटेशन (') हैं, और दोहरे नहीं हैं (")।
यह है कि आप कैसे grep =" में संक्षिप्तिकरण करते हैं। "
grep "<Ctrl+V><TAB>"
, यह काम करता है (यदि पहली बार: टाइप करेंgrep "
तो Ctrl + V कुंजी कॉम्बो दबाएं, फिर TAB कुंजी दबाएं, फिर टाइप करें"
और एंटर दबाएं, voilà!)