किसी शब्द में अंतिम वर्ण हटाएं, लेकिन केवल यदि चरित्र हो - बैश में


13

अंतिम चरित्र को कैसे हटाएं यदि यह वहां है?

इनपुट:

OpenOffice.org/m
openOffice.org/ozm
कार्मिक।
PFG।
फिल।
प्रो
resp।
Roonstr./m
roonstr./ozm

वांछित उत्पादन:

OpenOffice.org
openOffice.org
कार्मिक
PFG
फिल
प्रोफेसर
resp
Roonstr
roonstr

मुझे यह अब तक मिला है कि केवल डॉट बचा है लेकिन दुर्भाग्य से अंतिम सीड कमांड भी पत्र को हटा देता gहै: $ cat filename | grep "\." | cut -d"/" -f1 | sed 's/.$//'

जवाबों:


13

आपको बस अपने sedकमांड में डॉट से बचने की जरूरत है और सब कुछ ठीक हो जाएगा। ऐशे ही:

sed 's/\.$//'

क्योंकि जिस स्थिति में आप इसे नहीं छोड़ेंगे, .$स्ट्रिंग के अंत में किसी भी वर्ण से मेल खाएगा।

इसके अलावा आप अपने सभी रख सकते हैं sed+ grep+ cutमें सिर्फ एक sed:

sed 's=/[^/]*$==;s/\.$//' filename

महान, धन्यवाद, काम करता है! :) मैं 300k से अधिक लाइनों के साथ एक शब्दकोष का उपयोग करता हूं इसलिए यही कारण है कि मैं grep "\" का उपयोग करता हूं। वहाँ केवल एक डॉट के साथ शब्द पाने के लिए।
रेमोवेलास्टेडोनलाइफिस्टस्टेयर

sed भी इसे इस तरह smth के साथ कर सकते हैं sed -n '/\./{s=/[^/]*$==;s/\.$//;p}:। वैसे भी grep+ sedसिर्फ एक से ज्यादा काम करेगा sed
भीड़

यदि यह एक सेड के साथ किया जा सकता है तो यह अच्छा होगा। अपने पिछले sed कमांड को कैसे लागू करें?
रेमोवेलास्टेडोनलाइफिस्टस्टेयर

sed 's/[./]\+[^./]*$//'
पीटर।

धन्यवाद अब मुझे कट की जरूरत नहीं है, लेकिन अभी भी जीआरपी है। मेरे पाइप grep कमांड के बराबर एक sed तब grep को हटा देगा, यदि यह संभव है, तो यह अच्छा होगा। "इसके अलावा, आप अपने सभी sed + grep + को सिर्फ एक sed में काट सकते हैं" मेरे लिए काम नहीं करता है, सभी शब्दों को प्रिंट करता है?
रेमोवेलास्टेडोनलाइफिस्टस्टेयर

1

एक चरित्र को हटाने केवल अगर यह वहाँ है पैरामीटर पैरामीटर के विस्तार का वर्णन है।

 $ var=path.
 $ echo "$var    ${var%.}"
 path.    path

इस मामले में डॉट विशेष नहीं है (एक डॉट एक regex में विशेष है)।

अन्य पैटर्न के साथ हटाया जा सकता है %/*:

 $ var=openOffice.org/ozm
 $ echo "${var%/*}"
 openOffice.org

दोनों को हटाने के लिए:

 $ var=roonstr./ozm
 $ var=${var%/*}
 $ var=${var%.}
 $ echo "$var"
 roonstr

बेशक, स्रोत फ़ाइल के साथ काम करने के लिए फ़ाइल पर sed का उपयोग करना तेज़ है।
केवल डॉट को उद्धृत करना याद रखें (शाब्दिक रूप से मिलान करने के लिए, अन्यथा इसका मतलब है: कोई भी चरित्र)।

 $ sed 's,/.*,,;s,\.$,,' file

यह स्वीकृत उत्तर होना चाहिए। जरूरत से ज्यादा उभार।
डेविड पार्क

0

बस अपनी नियमित अभिव्यक्ति को बदलें: बचने के लिए . और आपको ज़रूरत नहीं हैgrep

cat filename | cut -d"/" -f1 | sed 's/\.$//'
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.