2013-01-20 53 views
7

मैं (पूर्वगामी नियम उच्च प्राथमिकता है)sed का उपयोग करने के लिए कैसे बैकस्लैश

\right) -> remain unchanged 
\right) -> remain unchanged 
\right] -> remain unchanged 
\right ] -> remain unchanged 
\right} -> remain unchanged 
\right } -> remain unchanged 
\ri)  -> \right) 
\ri  -> \rightarrow 
\right -> \rightarrow 

दूसरे शब्दों में, निम्नलिखित पैटर्न के लिए की जगह करना चाहते हैं के साथ स्ट्रिंग पैटर्न की जगह अगर कोई कोष्ठकों ब्रैकेट या ब्रेस है, मैं \ right, अगर कुछ और होना चाहते हैं, तो इसे \ rightarrow द्वारा प्रतिस्थापित किया जाना चाहिए। संक्षेप में, मैं बहुत सारे शॉर्टेंडेड Google डॉक समीकरणों को उचित लाटेक्स प्रारूप में बदलने की कोशिश कर रहा था। मैं निम्नलिखित के साथ आया था

sed -i 's/\\ri\([^g]\)/\\right\1/g' $tempfile1 #first step substitution 
sed -i 's/\\right\([^])}>|a]\)/\\rightarrow\1/g' $tempfile1 
sed -i 's/\\right \([^])}>|a]\)/\\rightarrow \1/g' $tempfile1 

यह ठीक काम करता है सिवाय इसके कि यह \ right \ in \ rightarrow \ जैसा अपेक्षित नहीं है। मेरा परीक्षण इनपुट tempfile1 निम्नलिखित

\ri\right\right \right)\right]\right }\right)\ri \right ]\righta \al \\ 

\rightarrow\right\rightarrow \right)\right]\right }\right)\rightarrow \right ]\rightarrow \alpha \\ 

यह देखते हुए कि \ सही \ हिस्सा सही ढंग से नहीं किया गया था में यह जाता है। तब मैं पहले से निम्न पंक्ति कहा, यह सोच कर कि यह स्पष्ट लेने चलेगा कि कौन से छोड़ दिया गया था, हालांकि, यह अपेक्षा के अनुरूप काम नहीं कर रहा है और अब मैं वास्तव में भ्रमित कर रहा हूँ ...

sed -i 's/\\right\\/\\rightarrow\\/g' $tempfile1 #why this does not work 

धन्यवाद एक बहुत!

+0

यह मेरे लिए काम किया। – aragaer

+0

निश्चित रूप से आप अपनी 3 स्क्रिप्ट को 'sed -i -e' का उपयोग करके एक में जोड़ सकते हैं ... pattern1 ... '-e' ... pattern2 ... '-e' ... pattern3 ... '.. .'। किलोबाइट आकार की फाइलों के लिए, तीन पास शायद अधिक मायने रखते हैं, लेकिन बहु-मेगाबाइट फ़ाइलों और बड़े के लिए, एक पास बनाम तीन एक बड़ा अंतर बना सकता है। –

+0

मैं देखता हूं, thx। मेरे लिए सामान्य फ़ाइल आकार 50K (सामान्य लाटेक्स दस्तावेज़) से कम है, लेकिन मेरे पास 30+ पैटर्न (उदाहरण के लिए \ al \ beta \ del \ b \ i \ sig) प्रतिस्थापित करने के लिए है और समय में संख्या बढ़ जाती है। (धन्यवाद इसके समीकरण संपादक और उनके हालिया "सुधार" के लिए Google डॉक) – gamebm

उत्तर

3

मुसीबत तब होती है जब अभिव्यक्ति:

sed -i 's/\\right\([^])}>|a]\)/\\rightarrow\1/g' 

लिए आवेदन किया है:

\right\right\ 

पहला मैच \right\ पढ़ता है और \rightarrow\ साथ यह बदल देता है; समस्या तब होती है जब स्कैन फिर से शुरू होता है, यह दूसरे right के r पर शुरू होता है, बैकस्लैश के साथ नहीं (जो पिछले मैच का हिस्सा था)।

सरल चाल अब प्रभाव के तहत फिर से शुरू करने से

sed -i -e 's/\\right\([^])}>|a]\)/\\rightarrow\1/g' \ 
     -e 's/\\right\([^])}>|a]\)/\\rightarrow\1/g' 

दूसरा \right\ अनुक्रम के साथ रीस्कैन सौदों आदेश को दोहराने के लिए है ...।

+0

स्पष्टीकरण के लिए बहुत बहुत धन्यवाद, अब मुझे लगता है कि मैं बेहतर समझता हूं। मेरी असली समस्या में, मेरे पास वास्तव में 30 से अधिक पैटर्न हैं, इसलिए मैं बस पूरी स्क्रिप्ट को फिर से दोहरा दूंगा। – gamebm

+1

यह काफी अच्छी तरह से काम कर सकता है। वैकल्पिक रूप से, आप 'sed' के बजाय पर्ल या पायथन का उपयोग कर सकते हैं और पैटर्न में पिछला संदर्भ का उपयोग कर सकते हैं ताकि' \ right \ 'में दूसरा बैकस्लैश पहले मैच का हिस्सा न हो और दोहराना जारी रहे जहां आप इसे चाहते हैं। –

+0

मुझे उन चीजों का अध्ययन करना है, मुझे पता है कि बहु-लाइन दस्तावेज़ में हेरफेर करने में sed अच्छा नहीं है, इसलिए मैं उन्हें ठीक तरह से इलाज नहीं कर सकता, उदाहरण के लिए, एक बार \\ (डबल बैकस्लच) को स्थानांतरित करने के लिए मुझे एक \ n (अंतराल)) और एक अतिरिक्त और अगली पंक्ति की शुरुआत में अगर वे पहले से नहीं हैं।(\ alpha \\\ बीटा \ alpha \ n और \ beta पर जाता है) यह समीकरण सरणी के उचित संरेखण के लिए है। मुझे पता है कि पर्ल को आसानी से इसे संभालना चाहिए, लेकिन यह sed के लिए बहुत कुछ लगता है। – gamebm