2012-08-30 26 views
14

का उपयोग कर [] ब्रैकेट को कैसे बदलूं I ​​have एक स्ट्रिंग है जिसे मैं विराम चिह्न को हटाना चाहता हूं।मैं SED

मैं

sed 's/[[:punct:]]/ /g' 

साथ शुरू किया था लेकिन मैं HP-UX पसंद नहीं है कि सभी समय पर समस्या नहीं थी, और कुछ समय मैं अपने स्ट्रिंग गायब हैं में एक के बाद एक $ 0 और कुछ भी मिलेगा। तो मैंने इसे मैन्युअल रूप से करने का प्रयास करने का फैसला किया।

मेरे पास निम्न कोड है जो मेरे सभी विराम चिह्नों पर काम करता है, जिसमें मुझे रूचि है, सिवाय इसके कि मैं किसी भी चीज़ के साथ अपने sed में स्क्वायर ब्रैकेट "[]" नहीं जोड़ सकता, अन्यथा यह किसी भी चीज़ को प्रतिस्थापित नहीं करता है, और मैं नहीं एक त्रुटि प्राप्त करें, इसलिए मुझे यकीन नहीं है कि क्या ठीक करना है।

वैसे भी यही मेरे पास है और [] को जोड़ना चाहता हूं।

sed 's/[-=+|[email protected]#\$%^&*(){}:;'\'''\"''\`''\.''\/''\\']/ /g' 

BTW मैं सोलारिस KSH उपयोग कर रहा हूँ, & हिमाचल प्रदेश

+0

क्या आपके अर्ध-कॉलन में 'punct;' एक टाइपो है? –

+1

आप इसके लिए sed का उपयोग क्यों कर रहे हैं? किसी स्पेस वाले वर्णों के बड़े समूह को प्रतिस्थापित करने के लिए, 'tr' का उपयोग करना बेहतर होता है। –

+0

@Will - हाँ यह एक टाइपो है .... मैं अपने ओपी को संपादित नहीं कर सकता। मैं रिक्त स्थान के साथ अपने विराम चिह्न को प्रतिस्थापित करने के लिए tr का उपयोग कैसे करूं? मैंने टीआर और एसईडी दोनों के साथ [: punct:] का उपयोग करने का प्रयास नहीं किया। – nitrobass24

उत्तर

1

यहाँ अंतिम कोड मैं

`echo "$string" | sed 's/[^a-zA-Z0-9]/ /g'` 

साथ समाप्त हो गया मैं कम से = और - डाल करने के लिए किया था है:

19

REDHAT आप कोष्ठक अभिव्यक्ति की शुरुआत में ही रखने की आवश्यकता होगी पहली चरित्र के रूप में

sed 's/[][=+...-]/ /g' 

']' रखने से उद्घाटन ब्रैकेट के तुरंत बाद, इसे क्लोजिंग ब्रैकेट की बजाय चरित्र सेट के सदस्य के रूप में व्याख्या किया जाता है। ब्रैकेट के अंदर कहीं भी '[' रखकर इसे सेट का सदस्य बना देता है।

इस विशेष वर्ण सेट के लिए, आप भी विशेष रूप से - से निपटने के लिए, जब से तुम [ और = के बीच वर्ण की एक श्रृंखला बनाने की कोशिश नहीं कर रहे हैं की जरूरत है। तो कक्षा के अंत में - डालें।

sed 's/[^a-zA-Z0-9]/ /g' 
+0

हाँ .. यह वही है जो मैं मूल रूप से सोच रहा था, लेकिन जब मैंने ऐसा किया तो मुझे हमेशा एक अवैध सीमा अंत त्रुटि प्राप्त हुई शब्द 1 $ word2 गूंजता है। sed's/[] - = + | ~! @ # \ $%^और *() {}:; '\' '' \ "'' \' '' \ '' \/'' \\ ' []// g ' sed: -e अभिव्यक्ति # 1, चार 36: अमान्य सीमा अंत – nitrobass24

+0

' अमान्य सीमा ''-' की वजह से है। जब मध्य में' -' दिखाई देता है, तो sed एक बनाने की कोशिश कर रहा है वर्णों की रेंज। इसके बजाय '\ -'' का उपयोग करें। –

+0

'-' वर्ण वर्ग में पहली वर्ण स्थिति में एक डैश का प्रतिनिधित्व करने के लिए होना चाहिए अन्यथा इसे वर्ण वर्ग मेटाएक्टेक्टर के रूप में समझा जा सकता है जो वर्णों की एक श्रृंखला को इंगित करता है। – potong

3

तुम भी वर्ण आप [उलट साथ] रखना चाहते हैं निर्दिष्ट कर सकते हैं बहुत अंत

+0

कुछ ऐसा जो कुछ भी मुझे एहसास नहीं हुआ था, वह बहुत अच्छा काम करता है, जब मेरी स्ट्रिंग में "$" होता है, तब भी "$" के बाद कुछ भी हटा दिया जाता है। मैंने ' गूंज शब्द 1 $ शब्द 2 | sed's/[^ a-zA-Z0 -9]// g'' और मेरा आउटपुट 'word1' – nitrobass24

+2

था, यह एक चर के रूप में' $ word2' को खोलने वाला खोल है, 'echo' word1 $ word2 'या' echo 'शब्द आज़माएं 'echo word1 \ $ word2' – perreal

+0

जो मैं समाप्त कर रहा हूं वह अंततः एक चर के रूप में मेरी स्ट्रिंग को सहेज रहा था ... फिर चरम कोट्स के अंदर चर को पारित कर रहा था। 'echo "$ string" | sed's/[^ a-zA-Z0-9]// g'' – nitrobass24

2

आप इसे मैन्युअल रूप से कर सकते हैं:

sed 's/[][\/$*.^|@#{}~&()_:;%+"='\'',`><?!-]/ /g' 

यह 32 विराम वर्ण निकालने के लिए, कुछ अक्षर का क्रम महत्वपूर्ण है:

  • - इस -]
  • की तरह अंत में होना चाहिए [][][other characters]
  • ' होना चाहिए कि '\''
  • की तरह भाग निकले तरह [^
  • में [.[=[: के साथ शुरू नहीं ^ के साथ शुरू नहीं और .]=]:]
  • के साथ समाप्त $]
यहाँ

तुम क्यों सब की व्याख्या कर सकते हैं साथ नहीं खत्म कि http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap09.html#tag_09_03_03

0

हाथ हो सकता है रेगेक्स कैप्चर तकनीक का उपयोग करने के लिए भी नेतृत्व किया गया (उदाहरण: नीचे नीचे):

echo "narrowPeak_SP1[FLAG]" | sed -e 's/\[\([a-zA-Z0-9]*\)\]/_\1/g' 
> narrowPeak_SP1_FLAG 

\[ : literal match to open square bracket, since [] is a valid regex 
\] : literal match to square close bracket 
\(...\) : capture group 
\1 : represents the capture group within the square brackets