2010-11-12 14 views
6

के साथ एकाधिक अवधि को प्रतिस्थापित करें। मैं .el फ़ाइल से सूर्योदय-कमांडर कमांड के emacs org-mode में एक तालिका बना रहा हूं (धोखा शीट बनाना चाहता हूं)। सूची इस प्रकार है:sed: एकाधिक अवधि

/, j .......... go to directory 
p, n .......... move cursor up/down 
M-p, M-n ...... move cursor up/down in passive pane 
^, J .......... go to parent directory 
... 

मुझे लगता है कि बनाने के लिए इस प्रारूप के साथ एक संगठन-मोड तालिका में हैं:

| /, j  | go to directory      | 
| p, n  | move cursor up/down     | 
| M-p, M-n | move cursor up/down in passive pane | 
| ^, J  | go to parent directory    | 
... 

संगठन रिक्ति की देखभाल करेगा; मुझे बस "| कमांड | स्पष्टीकरण" की आवश्यकता है।

मैं लंबवत स्लैश के साथ कई अवधि को प्रतिस्थापित करने के लिए sed नहीं प्राप्त कर सकता। मेरे वर्तमान प्रयास इस तरह किया गया है:

cat in.org | sed -e 's/[.]*/|/g' > out.org 
cat in.org | sed -e 's/[.]/|/g' > out.org 
cat in.org | sed -e 's/[.*]/|/g' > out.org 

मैं पहले से ही इस का उपयोग किया है प्रमुख और ऊर्ध्वाधर स्लैश के साथ खाली स्थान के अनुगामी को बदलने के लिए:

sed -e 's/^[ \t]*/|/g;s/[ \t]*$/|/g'| 

अब मैं सिर्फ के एक स्ट्रिंग के लिए भी ऐसा ही करने की जरूरत है अवधि। मुझे डर है कि मैं जंगलीकार्ड के रूप में उनका इलाज करने के बजाए अवधि की अवधि (और उनमें से एक ब्लॉब को लक्षित करने) की अवधि के इलाज के लिए पर्याप्त रूप से पर्याप्त समझ में नहीं आता हूं। दूसरा और तीसरा प्रत्येक अवधि एक अवधि की तरह व्यवहार करता है, क्योंकि मैं ऊर्ध्वाधर स्लेश के गुच्छा के साथ समाप्त होता हूं।

लेकिन पहला ऐसा लगता है कि प्रत्येक चरित्र के बीच एक वर्ट स्लैश लगाया जाता है, इसलिए मुझे यकीन नहीं है कि यह ऐसा क्यों कर रहा है। ऐसा लगता है जैसे यह वाइल्डकार्ड चरित्र की तरह अभिनय करने जा रहा है।

किसी भी मदद के लिए धन्यवाद।

उत्तर

4

आपको इस अवधि से बचने की जरूरत है; अवधि "किसी भी चरित्र" से मेल खाती है। और, के बाद से एसईडी हमेशा एक + (1 या अधिक) ऑपरेटर नहीं है, आप के रूप में

[email protected]:~$ echo 'h...ello world' | sed 's/^/|/;s/\.\.*/|/;s/$/|/' 
|h|ello world| 

में और, आपके सवाल का फिर से पढाना के बाद, आप एक पाइप में चाहते हैं, एक 0 या उससे अधिक के बाद उपयोग करना चाहते हैं शुरुआत और अंत। तो, एक पाइप के साथ^और $ को भी बदलें। आप इसे तीन-अभिव्यक्तियों के साथ कर सकते हैं, लेकिन मुझे केवल तीनों को अर्धविराम से अलग कमांड लाइन में डालना पसंद है। यह पैटर्न को शोर की तरह दिखने में मदद करता है। :)

यदि आप 2 या अधिक अवधि का मिलान करना चाहते हैं, तो \.\.\.* का उपयोग करें। इत्यादि। यह एक शर्म की बात है कि sed लगातार श्रृंखला अभिव्यक्तियों का समर्थन नहीं करता है।

+0

अद्भुत। यह पहला था और महान काम किया। अब जब मैं इसके बारे में सोचता हूं, सिंटैक्स समझ में आता है, हालांकि मेरी समस्या यह सोच रही थी कि * "1 या उससे अधिक मैच" था, 0 या उससे अधिक नहीं, जिस स्थिति में आप सही थे: मुझे 0 या उससे अधिक अवधि के बाद की अवधि की आवश्यकता थी। – Hendy

4

यह यह तुम्हारे लिए क्या करना चाहिए:

sed -r -e 's/\.{2,}/|/' -e 's/(.*)/|\1|/' 

{2,} सिर्फ 2 या अधिक, मिलान करने के लिए, इसलिए यदि आप अन्य स्थानों में अवधियों में चलाने के लिए, आप अभ्यस्त समस्या आ रही है कि कहते हैं। '-e' एकाधिक regexes प्राप्त करता है, और '-r' का मतलब विस्तारित regexes का उपयोग करें।

उम्मीद है कि यह काम करता है, यह gnu sed 4.1.2 पर करता है।

+0

इसे {2,} समाधान के लिए पसंद है। एक दम बढ़िया। अधिक अवधि नहीं हुई लेकिन महान सोच - सावधानीपूर्वक कोडिंग! हालांकि, मैं दूसरे भाग का पालन नहीं करता हूं। मेरे लिए, यह ज्यादातर काम करता था लेकिन पहले कॉलम में बहुत सारे टैब डाले थे, इसलिए मेरा परिणाम "| कमांड \ t \ t \ t \ t | स्पष्टीकरण |" जैसा था। टिप्पणी बॉक्स में टाइप करना मुश्किल है! – Hendy