एक स्ट्रिंग के चारों ओर एक उद्घाटन और समापन वर्ग ब्रैकेट को हटाने के लिए sed का उपयोग करना


19

मैं इस कमांड को Ubuntu 12.04.1 LTS पर एक बैश शेल में चला रहा हूं। मैं दोनों को हटाने का प्रयास कर रहा हूं [और ]एक में पात्र गिर गए, दूसरी बार पाइप करने के बिना।

मुझे पता है कि वर्ग कोष्ठक का एक रेगेक्स में विशेष अर्थ होता है इसलिए मैं बैकस्लैश के साथ बहकर उन्हें बच रहा हूं। मैं जिस परिणाम की उम्मीद कर रहा था वह सिर्फ स्ट्रिंग है 123लेकिन वर्ग कोष्ठक बने हुए हैं और मुझे यह जानना अच्छा लगेगा कि क्यों!

~$ echo '[123]' | sed 's/[\[\]]//'
[123]

मैं अंततः जो हासिल करने की कोशिश कर रहा हूं, वह है कि जो कुछ भी वर्ग ब्रैकेट के बीच है, उसे मेरी बैश स्क्रिप्ट में कहीं और उपयोग करने के लिए बैश वैरिएबल में असाइन किया जा सकता है, इसलिए यदि इसे प्राप्त करने का एक बेहतर तरीका है (awk, शायद?) का उपयोग करके, कृपया मुझे बताएं? ।
Xhantar

2
केवल एक टिप्पणी के रूप में जोड़ते हुए: आप बैश के पीई फीचर का उपयोग कर सकते हैं जैसे: str='[123]'; str1=${str/\[/}; str2=${str1/\]}; echo $str2
वैलेंटाइन बजरमी

1
@ val0x00ff - शुद्ध बैश प्रतिस्थापन .. धन्यवाद! :) कुछ नया सीखा।
Xhantar

जवाबों:


25

यह आसान है, यदि आप मैन्युअल रूप से ध्यान से पालन ​​करते हैं : एक चरित्र वर्ग के अंदर सभी सदस्य विशेष अर्थ (कुछ अपवादों के साथ) खो देते हैं। और] अपना विशेष अर्थ खो देता है यदि इसे सूची में पहले स्थान पर रखा जाता है । प्रयत्न:

$ echo '[123]' | sed 's/[][]//g'
123
$

यह कहता है:

  1. बाहरी [कोष्ठक] के अंदर , शामिल वर्णों में से किसी को प्रतिस्थापित करें:
    • ] तथा
    • [
  2. रिक्त स्ट्रिंग द्वारा उनमें से किसी को प्रतिस्थापित करें - इसलिए रिक्त प्रतिस्थापन स्ट्रिंग //,
  3. उन्हें हर जगह बदलें ( विश्व स्तर पर ) - इसलिए अंतिम g

जब भी इसे शामिल किया जाए , फिर से इसे कक्षा में पहले स्थान पर ] होना चाहिए।


11

मुझे यकीन नहीं है कि यह काम क्यों नहीं करता है लेकिन यह करता है:

echo '[123]' | sed 's/\(\[\|\]\)//g'

या यह:

echo '[123]' | sed -r 's/(\[|\])//g'

आप एक अलग दृष्टिकोण भी आज़मा सकते हैं और स्ट्रिंग को कोष्ठक के अंदर मिलान कर सकते हैं (यह मानते हुए कि स्ट्रिंग को आसानी से मिलान किया जा सकता है और कोष्ठक द्वारा परिभाषित नहीं किया गया है):

echo '[123]' | egrep -o "[0-9]+"

मैं अपने मूल regex के साथ एक ही परेशानी का उपयोग grepकर रहा हूँ तो मुझे संदेह है कि यह सिर्फ एक sedबात नहीं है।

अजीब तरह से, ये अलग-अलग परिणाम देते हैं, लेकिन उनमें से एक आप जो चाहते हैं उससे मेल खाता है:

echo '[123]' | egrep -o '[^][]+'
123

echo '[123]' | egrep -o '[^[]]+'
3]

इसे अपने मूल पर लागू करना sed(और /gसंशोधक जोड़ना ताकि यह दोनों कोष्ठक को हटा दे ):

echo '[123]' | sed 's/[][]//g'
123

आपका तीसरा दृष्टिकोण (egrep -o ...) मेरी समस्या का सबसे साफ समाधान है। मेरे पास केवल चौकोर कोष्ठक के बीच पूर्णांक होंगे (और क्षमा करें, मुझे अपने प्रश्न में इसका उल्लेख करना चाहिए) इसलिए मुझे लगता है कि किसी भी विषमता में नहीं चलना चाहिए। धन्यवाद!
Xhantar

3
आप भी उपयोग कर सकते हैं tr: echo '[123]' | tr -d '[]'- बचने के बारे में regexp भ्रम से बचा जाता है।
जेम्स ओ'गोरमैन

@ जेम्स ओ'गॉर्मन - दिलचस्प। किसी कारण से मुझे लगा कि trएक बार में केवल एक चरित्र अधिकतम का अनुवाद किया जा सकता है, लेकिन मैं गलत था। धन्यवाद!
Xhantar

4

कोष्ठक से पहले और बाद में सब कुछ निकालने के लिए:

$ echo '[123]' | sed 's/.*\[//;s/\].*//;'
123

यदि आपका डेटा ऐसा है तो हमेशा चौकोर कोष्ठक के साथ शुरू और समाप्त होता है:

$ echo '[123]' | sed 's/.//;s/.$//;'
123

मैं जिस डेटा के साथ काम कर रहा हूं, वह हमेशा स्क्वायर ब्रैकेट के साथ शुरू और समाप्त होगा। मैं अभी भी जानना चाहूंगा कि मेरा समाधान हालांकि काम क्यों नहीं कर रहा था। कोई विचार? और क्या 2x रेगेक्स को निर्दिष्ट किए बिना ऐसा करने का एक तरीका है?
Xhantar

1
@ गुरू इस समाधान ने मुझसे काम लिया, और ज़ांथर के लिए, यह वास्तव में देर से जवाब है, लेकिन मैं tldp.org पर आपके कोड और बैश बिगिनर्स गाइड से क्या देख सकता हूं, आप कई खोज करने और बदलने की कोशिश कर रहे थे, एक के लिए '[' और दूसरे के लिए ']' जो अभ्यस्त काम करते हैं, दो अलग-अलग खोज को प्रतिस्थापित करने और "का उपयोग करने के लिए"; या -e विकल्प। 's / <खोज> / <बदलें> / g; s / <खोज> / <बदलें> / g 'या sed -e' s / <खोज> / <बदलें> / g '-e' s / <खोज> / <बदलें> / g '
अरुणकुमार

1

यदि आपके पास 'abcdef [123] ghijk' जैसा अधिक जटिल स्ट्रिंग है, तो आप केवल वर्ग कोष्ठक के बीच पाठ निकालने के लिए आंतरिक bash कमांड 'cut' का उपयोग कर सकते हैं:

$ echo 'abcdef[123]ghijk' | cut -d '[' -f 2 | cut -d ']' -f 1
123

1

आप खुलने वाले ब्रैकेट का उपयोग करके बच सकते हैं \[। समापन ब्रैकेट के लिए, का उपयोग करें[]]

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