क्या हम sed कमांड का उपयोग करके लाइनक्स के प्रत्येक शब्द के अंतिम शब्द को प्रिंट कर सकते हैं?


9

मान लीजिए, यदि कोई फ़ाइल निम्न पंक्तियों से युक्त है, यदि वे हैं

12345 567 7878 66

   er3 t45t y6y46y 


 4y6 y656y y5y

   46y6 65y7 y66uyuy

 yy46y6y

आउटपुट की तरह दिखना है:

66

y6y46y

y5y

y66uyuyy

y46y6y

मैंने कमांड sed 's/.* //g'फ़ाइल नाम और कई अन्य कमांड की कोशिश की है sed, लेकिन यह काम नहीं कर रहा है।

क्या मैं जान सकता हूं कि सटीक sedकमांड क्या है ?


क्या इसका उपयोग करना आवश्यक है sed?
coffeMug

जवाबों:


8
awk '{print $NF}'
sed 's/[[:blank:]]*$//;s/.*[[:blank:]]//'

यह अभी भी हर खाली लाइन के लिए एक खाली लाइन प्रिंट करेगा। इससे बचने के लिए:

awk 'NF{print $NF}'
sed 's/[[:blank:]]*$//;s/.*[[:blank:]]//;/./!d'

एकल अभिव्यक्ति विकल्प sed -n 's/.*[[:blank:]]\+\([^[:blank:]]\+\)[[:blank:]]*$/\1/p':।
जिमीज २ j

@ जिम्मीज - कि कोई काम नहीं करता है यदि अंतिम खाली क्रम भी पहले नहीं है और इससे पहले कोई रिक्त स्थान नहीं है। इसके अलावा, आप केवल .*पूंछ पर भी कर सकते हैं , शायद - आप कुछ भी बाहर शासन करते हैं लेकिन वैसे भी रिक्त स्थान w / .*[^[:blank:]]
मिकसेर


4

तुम कोशिश कर सकते हो :

  • sed 's/.* //'
  • awk '{print $NF}'

4

तुम लगभग वहां थे। बस अंतिम शब्द निर्दिष्ट करें:

sed 's/^.* \([^ ][^ ]*\)/\1/g'

यह क्या करता है:

  1. '^। *' लाइन की शुरुआत और किसी भी स्थान के भीतर सब कुछ हटा देता है।
  2. '\ (...) \' एक पैटर्न से मेल खाता है और इसे \ _ के रूप में लौटाता है।
  3. '[^]' इसमें किसी स्थान के बिना कुछ भी मेल खाता है।

(बेहतर समाधान जोड़ने के लिए संपादित। धन्यवाद Hildred!)


1
यहां एक छोटी अभिव्यक्ति है: sed -r 's/.* ([^ ]+)/\1/g'यदि विस्तारित नियमित अभिव्यक्तियों की अनुमति है, जो आमतौर पर मामला है।
मल्कोव २ m'१५ को

छोटा संस्करण, जो आपके स्थान पर रखने का उपयोग कर रहा है, न कि आप क्या रखना चाहते हैं:sed 's/.* //'
Uriel

2

उदाहरण के लिए, आप grepइसके बजाय कुछ पर्याप्त पैटर्न का उपयोग कर सकते हैं sed:

grep -o "[a-Z0-9]*$"

इस उदाहरण में, [...]एक "शब्द" (इस मामले में अल्फ़ान्यूमेरिक्स, अन्य प्रतीकों को जोड़ा जा सकता है, जिनमें से कुछ को बच जाना चाहिए) के लिए उपयुक्त माना जाने वाले वर्णों की श्रेणी शामिल है।


3
यह मानता है कि पंक्ति के अंत में कोई रिक्त नहीं है। a-Zएक सीमा के रूप में बहुत समझदारी नहीं है, यहां तक ​​कि ASCII- आधारित स्थानों में भी। ध्यान दें कि -oएक GNU एक्सटेंशन है।
स्टीफन चेज़लस

0

यदि आप 1 या अधिक गैर-रिक्त वर्णों के किसी भी अनुक्रम का अर्थ करने के लिए शब्द अर्हता प्राप्त करते हैं तो उत्तर निश्चित रूप से हाँ है, और यह बहुत ही सरल रूप से किया जाता है। इसका कारण यह है और बूलियन कंपार्टमेंट हैं और - बशर्ते एक स्ट्रिंग में सभी वर्ण पूर्ण हों - यू किसी भी संभव स्ट्रिंग का वर्णन उसी तरह से कर सकता है जैसे वह करता है।[[:blank:]]*[^[:blank:]]*[[:blank:]]*[^[:blank:]]*.*

यदि एक अधूरा चरित्र या अन्यथा अमान्य बाइट अनुक्रम एक स्ट्रिंग के भीतर मौजूद है, तो न तो सफलतापूर्वक इसे पूंछ के लिए सिर का वर्णन कर सकता है - जैसा कि कभी-कभी गलत एन्कोडिंग में स्ट्रिंग की व्याख्या करते समय हो सकता है। किसी भी स्ट्रिंग में बाइट प्रति पूर्ण चरित्र सुनिश्चित करने के लिए, सी लोकेल को मजबूर किया जा सकता है:

LC_ALL=C sed ...

... जो किसी भी मुद्दे को सिर से पूंछ तक स्ट्रिंग जैसे सर्व-समावेशी पैटर्न जैसे .*या के साथ बताने से बचता है([ ]*[^ ]*)*

एक पूरी तरह से पूरक पैटर्न के रूप में कई बार दोहरा सकते हैं जैसा कि पैटर्न में किसी भी ब्रेक के बिना अंतिम संभव घटना पर उतरने के लिए किसी भी स्ट्रिंग की लंबाई के लिए बाएं से दाएं आवश्यक है। यह निश्चित रूप से, नियमित भाषा है।

BRE:

sed 's/\(\([^[:blank:]]*\)[[:blank:]]*\)*/\2/'

ERE:

sed -E 's/(([^[:blank:]]*)[[:blank:]]*)*/\2/'

ये दोनों संस्करण अभी भी रिक्त लाइनों को मुद्रित करेंगे, और इसका कारण यह है कि क्लेन *स्टार एक पैटर्न के शून्य या अधिक घटनाओं से मेल खाता है। यह पहले शून्य या अधिक नहीं रिक्त पात्रों से मेल खाता है, फिर शून्य या अधिक रिक्त वर्ण, फिर समूहबद्ध मैचों के शून्य या अधिक घटनाएँ जब तक कि यह अपनी संपूर्णता में स्ट्रिंग से मेल नहीं खाता है।

इस सब से मेल खाने के बाद, जादू प्रतिस्थापन में होता है - समूह द्वारा दिए गए संदर्भ \1और \2प्रत्येक की अंतिम घटनाएं होती हैं। इसलिए जब प्रतिस्थापन किया जाता है तो सभी स्ट्रिंग को केवल शून्य या अधिक रिक्त वर्णों की एक पंक्ति पर अंतिम घटना से बदल दिया जाता है - या उपसमूह \2

बेशक यह किसी भी संभावित स्ट्रिंग के लिए काम करता है - यहां तक ​​कि एक खाली भी - जिसका अर्थ है कि दोनों रूप उन लाइनों के लिए नईलाइन वर्णों को प्रिंट करेंगे जिनमें केवल खाली अक्षर हैं या कोई भी नहीं है। इसे संभालने के लिए कुछ चीज़ें हैं जो आप कर सकते हैं, लेकिन पहले अक्षर वर्ग को टाइप करने के लिए थोड़ा आसान करें:

b='[:blank:]'

अब, केवल प्रिंट करने के लिए यदि एक पंक्ति में एक या अधिक रिक्त अक्षर नहीं हैं, जो आप कर सकते हैं:

BRE:

sed -n "s/\(\([^$b]*\)[$b]*\)*/\2/;/./p"

ERE:

sed -En "/[^$b]/s/(([^$b]*)[$b]*)*/\2/p"
  1. BRE मामला - प्रतिस्थापन हमेशा किया जाता है और कम से कम एक शेष चरित्र के साथ केवल पैटर्न रिक्त स्थान मुद्रित होते हैं।
  2. ईआरई मामला - प्रतिस्थापन केवल कभी कम से कम एक नहीं चार चार पैटर्न पैटर्न पर प्रयास किया जाता है।

या तो फार्म या तो विधि के साथ काम करेगा - जब तक वाक्य रचना सही है।

-nस्विच से अक्षम ऑटो मुद्रण पैटर्न अंतरिक्ष की, और pकरने के लिए ध्वज s///ubstitution या /पते के /आदेशों उसके परिणामों को केवल तभी सफल प्रिंट करता है।

यह वही तर्क किसी भी {num}घटना को प्राप्त करने के लिए लागू किया जा सकता है , साथ ही, जैसे:

BRE:

sed -n "s/\([$b]*\([^$b]\{1,\}\)\)\{num\}.*/\2/p"

ERE:

sed -En "s/([$b]*([^$b]+)){num}.*/\2/p"

... जहाँ numदोनों regexps में {num}रिक्त वर्णों के अनुक्रम के केवल वें निर्दिष्ट घटना को मुद्रित करने के लिए एक संख्या के साथ प्रतिस्थापित किया जा सकता है । एक स्ट्रिंग में अग्रणी स्थान के लिए गिनती तिरछी नहीं है यह सुनिश्चित करने के लिए यहां थोड़ा अलग रूप का उपयोग किया जाता है।

ध्यान दें कि -EERE स्विच sedBSD और GNU दोनों संस्करणों में समर्थित है, हालाँकि यह अभी POSIX मानक सिंटैक्स नहीं है।


अच्छा स्पष्टीकरण, अच्छा हैक, लेकिन ध्यान दें कि यह पारंपरिक sed कार्यान्वयन के साथ काम नहीं करेगा (जैसे सोलारिस / यूएसआर / बिन / सेड) sed_su3उदाहरण के लिए विरासत toolchest से)। इसलिए, हालांकि मुझे जवाब पसंद है, मैं उस दृष्टिकोण की सिफारिश नहीं करूंगा।
स्टीफन चेज़लस 22

FreeBSD में काम करने के लिए प्रतीत नहीं होता है या तो।
स्टीफन चेज़लस

@ स्टीफनचेज़ेलस - हाँ, प्रदर्शन वास्तव में इस तरह की चीज के लिए भयानक है, लेकिन गिने हुए घटनाओं को चुनने के लिए यह बहुत प्रभावी हो सकता है। और लाइन केस के अंत के s/.* \([^[:blank:]]\{1,\}\).*/\1/लिए कहीं बेहतर है, लेकिन यह अधिक कठिन है जब कई लाइनें शामिल होती हैं। बस दूसरे दिन, हालांकि, मुझे पता चला 's/\(\n\)*/\1/g;s/\n\(\n.*\)*/&&/[num];s///[samenum]कि बहुत प्रभावी ढंग से किनारे हो सकते हैं। वैसे भी, जब तक तर्क में कोई गड़बड़ त्रुटि नहीं है तब तक मैं खुश हूं - मैंने सोचा कि मुझे कुछ याद करना चाहिए।
mikeserv

@ स्टीफनचेलजैस - ओह, और पुराने sedएस के बारे में - यह थोड़ा अजीब है - यह मानक के अनुसार ध्वनि होना चाहिए। xrat कहते हैं ... मानक डेवलपर्स ने सामान्य ऐतिहासिक व्यवहार पर विचार किया, जो एक विशिष्ट कार्यान्वयन के गैर-इरादतन परिणाम के रूप में समर्थित "\n*", लेकिन नहीं "\n\{min,max\}", "\(...\)*"या "\(...\)\{min,max\}", और उन्होंने उप-संदर्भों और बैक-रेफरेंस के बाद दोहराव और अंतराल दोनों अभिव्यक्तियों का समर्थन किया।
माइकस

@ स्टीफनचेलजेलस - और मानक कहते हैं ... अगर तारांकन ( '*' )या एक अंतराल अभिव्यक्ति (देखें आइटम (5)) की वजह से बैक-रेफरेंस मैच द्वारा उपप्रकार एक स्ट्रिंग से अधिक से मेल खाता है , तो बैक-रेफरेंस अंतिम (सबसे दाएं) से मेल खाएगा ) इन तार के। मुझे पूरा यकीन है कि मैंने इस w का परीक्षण किया है / minisedहालांकि - निश्चित रूप से मैं कुछ अजीब w / minisedदूसरे दिन, वैसे भी परीक्षण कर रहा था ।
mikeserv

0
sed 's/^ star.star //'  filename  or sed 's/^[[:blank:]]star.star[[:blank:]]//' filename

विश्लेषण:

  • s -- विकल्प

  • / - देखने के लिए अभिव्यक्ति की सीमा

  • ^ - लाइन की शुरुआत से

  • [[:blank:]]* - अगर मामले में लाइन की शुरुआत में रिक्त स्थान हैं

  • .* - कोई भी चरित्र

  • [[:blank:]] - और एक खाली चरित्र

  • / - स्थानापन्न करने के लिए अभिव्यक्ति की शुरुआत

  • / - कमांड सिंटैक्स का अंत

पुनश्च: मैंने कमंड में स्टार लिखा है।


प्रश्न में दिए गए डेटा पर यह कैसे लागू होगा?
Kusalananda

@Scott s/.*[[:blank:]]//तब तक काम करेगा जब तक एक पंक्ति के अंत में रिक्त स्थान न हों।
Kusalananda

-1

हाँ। निम्नलिखित sed कमांड पहले सभी अनुगामी व्हाट्सएप ( s/ *$//) को हटाती है और फिर अंतिम व्हाट्सएप (और) तक सब कुछ शामिल करती है s/.* //[[:blank:]]टैब और अन्य अंतरिक्ष जैसे पात्रों को पकड़ने के लिए शाब्दिक व्हाट्सएप की जगह लेना संभव है ।

$ echo "  aaa bbb cc   " | sed -e 's/ *$//' -e 's/.* //'
cc
$ echo "  aaa bbb cc" | sed -e 's/ *$//' -e 's/.* //'
cc
$ echo "aaa bbb cc   " | sed -e 's/ *$//' -e 's/.* //'
cc
$ echo "aaa bbb cc" | sed -e 's/ *$//' -e 's/.* //'
cc
$ echo "  cc  " | sed -e 's/ *$//' -e 's/.* //'
cc
$ echo "cc" | sed -e 's/ *$//' -e 's/.* //'
cc

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