कमांड से प्रत्येक आउटपुट लाइन के लिए उपसर्ग और प्रत्यय स्ट्रिंग


17

मैं बैश स्क्रिप्ट लिखने की कोशिश में एक समस्या में भाग गया हूं। जब grepआउटपुट होता है, तो यह कई लाइनों को लौटाता है (आमतौर पर)। मैं इनमें से प्रत्येक आउटपुट लाइनों के लिए एक उपसर्ग और प्रत्यय देना चाहूंगा।

मैं यह भी नोट करना चाहूंगा कि मैं पाइपिंग lsकर रहा हूं grep, जैसे:

ls | grep

2
आपको पार्स नहीं करना चाहिए ls- यह बुरा जूजू है। इसके अलावा, क्या यह होना चाहिए grep? और क्या आप कुछ उदाहरण आउटपुट दे सकते हैं?
सोब्रीक

1
यदि फाइलनेम में एक नई रेखा है तो आप अपनी स्क्रिप्ट क्या करना चाहते हैं?
ताई विनीका

जवाबों:



5

के साथ sed:

ls | grep pattern | sed -e 's/^/prefix/' -e 's/$/suffix/'

लेकिन ध्यान दें, यह लाइन फीड्स के साथ फ़ाइल नाम के साथ समस्याओं से ग्रस्त है, और पार्सिंग की सभी मिश्रित समस्याएं lsजो आम तौर पर एक बुरा विचार है।

पर्ल के साथ

perl -e 'print "prefix".$_."suffix\n" for grep { m/somepattern/} glob "*"'

नोट - perl grepएक पैटर्न ले सकता है - grepकमांड की तरह , लेकिन आप फाइल टेस्ट भी कर सकते हैं।

उदाहरण के लिए

grep {-d} glob "*" #filters directories.
grep { (stat)[9] > time() - 60 } glob "*" #reads file mtime and compares. 

grepडिफ़ॉल्ट पुनरावृत्ति के भीतर $_वर्तमान तत्व मान पर सेट किया गया है, इसलिए आप sed/ grepregex शैली को लागू कर सकते हैं , या इसके आधार पर कई प्रकार के कार्य कर सकते हैं $_


मैं ´sed´ का उपयोग करके अपने पहले उदाहरण में एक प्रत्यय / उपसर्ग के रूप में एक चर कैसे शामिल करूंगा?
स्पेशलबॉम्ब

उद्धरणों को बदलें और बस उन्हें उपयोग करें।
सोब्रिक

2

इस मामले में जीएनयू findआपको एक ही बार में इन सभी कामों को करने देता है, पाइप को खत्म करना और संभावित रूप से परेशान करना ls:

find . -maxdepth 1 -name '[^.]*' \
  -regextype posix-extended -regex "MYPATTERN" \
  -printf 'SOMEPREFIX %f SOMESUFFIX\n'

( findनिश्चित रूप से अन्य कमांड के आउटपुट को मनमाने ढंग से संशोधित करने का एक अच्छा तरीका नहीं है!)

कुछ नोट:

  • -maxdepth 1और -name [^.]*नाम मिलान कार्य को मैदान ls(या ls .) के समान बनाएं । आप किसी भी शैल-शैली के ग्लोब का उपयोग कर सकते हैं, लेकिन ध्यान दें कि "*" एक अग्रणी से मेल खाएगा "।" एक नाम † के विपरीतbash , तो [^.]*इसका मतलब कुछ भी है कि एक अग्रणी नहीं है "।"
  • MYPATTERN एक उचित POSIX ERE है (डिफ़ॉल्ट प्रकार Emacs है, यहां देखें ), लेकिन यह पूरे फ़ाइल नाम से मेल खाना चाहिए इसलिए .*thing.*केवल इसके बजाय कुछ का उपयोग करेंthing
  • आप शायद सिर्फ एक का उपयोग कर सकते हैं-name-regex दोनों में से बजाय / (जैसे -regex "[^।]। MYPATTERN। "
  • -printfबहुत सारी चीजों का समर्थन करता है ,%n अनलंकृत फ़ाइल या निर्देशिका का नाम है

( findहालांकि यह आपके संस्करण पर निर्भर कर सकता है , अपने मैन पेज के "मानक कॉन्फ्रेंस" अनुभाग की जांच करें)

आवश्यक कोई बाहरी कार्यक्रमों के साथ एक संभावित विकल्प के रूप में bashहै compgenजो अन्य बातों के अलावा, एक करने के लिए globs, बराबर का विस्तार lsनहीं विकल्पों के साथ:

compgen -P "someprefix>" -S "<somesuffix" -G "pattern"

यह व्हॉट्सएप के साथ नए नाम सहित फिल्नाम को संभालता है। compgen -G "*"एक सादे के रूप में एक ही आउटपुट प्रदान करना चाहिए ls(लेकिन ध्यान दें कि ls *पूरी तरह से एक अलग चीज है)। आपको अभी भी आवश्यकता होगी grep, और यह समस्या को हल कर सकता है या नहीं भी कर सकता है, लेकिन यह एक उल्लेख के लायक है।


0

sedऔर findसमाधानों को चुनौती दी जाती है कि क्या आपके उपसर्ग / प्रत्यय में regex प्रमुख वर्ण शामिल हैं या यदि वे पर्यावरण चर (तत्काल मान के बजाय) पारित करना चाहते हैं, xargs+echo यहां अधिक उपयुक्त हो सकता है।

पर्यावरण चर के साथ:

ls | grep p | xargs -I % sh -c "echo $PATH/%"

एक इनलाइन के साथ:

ls | grep p | xargs -I % sh -c "echo `pwd`/%"
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.