मैं समझ नहीं सकता sed बताने के लिए dot match new line बताने के लिए:कैसे एसईडी "डॉट मैच नई लाइन"
एक
:
तीन
echo -e "one\ntwo\nthree" | sed 's/one.*two/one/m'
मैं प्राप्त करने की उम्मीद
इसके बजाय मुझे मूल मिलता है:
एक
दो
तीन
मैं समझ नहीं सकता sed बताने के लिए dot match new line बताने के लिए:कैसे एसईडी "डॉट मैच नई लाइन"
एक
:
तीन
echo -e "one\ntwo\nthree" | sed 's/one.*two/one/m'
मैं प्राप्त करने की उम्मीद
इसके बजाय मुझे मूल मिलता है:
एक
दो
तीन
sed
लाइन पर आधारित उपकरण है। मुझे नहीं लगता कि ये एक विकल्प है।
आप h/H
(होल्ड), g/G
(प्राप्त) का उपयोग कर सकते हैं।
$ echo -e 'one\ntwo\nthree' | sed -n '1h;1!H;${g;s/one.*two/one/p}'
one
three
शायद तुम कोशिश करनी चाहिए vim
:%s/one\_.*two/one/g
आप अजगर इस तरह से उपयोग कर सकते हैं:
$ echo -e "one\ntwo\nthree" | python -c 'import re, sys; s=sys.stdin.read(); s=re.sub("(?s)one.*two", "one", s); print s,'
one
three
$
इस पूरी अजगर के मानक इनपुट (sys.stdin.read()
) पढ़ता है, तो "एक" के लिए विकल्प "एक। * दो" dot matches all setting enabled (नियमित अभिव्यक्ति की शुरुआत में (?s)
का उपयोग करके) और फिर संशोधित स्ट्रिंग को प्रिंट करता है (ट्राई मुद्रण में लिंग कॉमा का उपयोग अतिरिक्त अतिरिक्त लाइन जोड़ने से प्रिंट को रोकने के लिए किया जाता है)।
उत्कृष्ट, महान सलाह, मुझे भविष्य की परेशानियों से बचाएगी। मुझे आसान मल्टीलाइन पैटर्न याद आते हैं, जिनका उपयोग विंडोज पर रेगेक्सबड्डी में किया गया था, और फिर पाइथन में इसी तरह के आसान पुनः मॉड्यूल का उपयोग किया गया है कि मैं एक्टिवस्टेट पर कुछ और सामान्य कोड खोजूंगा और इसे सिस्टम कमांड के रूप में उपलब्ध कराऊंगा। चियर्स – theta
यह आप के लिए काम कर सकते हैं:
<<<$'one\ntwo\nthree' sed '/two/d'
या
<<<$'one\ntwo\nthree' sed '2d'
या
<<<$'one\ntwo\nthree' sed 'n;d'
या
<<<$'one\ntwo\nthree' sed 'N;N;s/two.//'
Sed
(\n
सहित) मैच सभी पात्रों एक डॉट .
का उपयोग कर करता है लेकिन आम तौर पर यह पहले से ही, छीन लिया गया है \n
बंद, चक्र के हिस्से के रूप तो यह पैटर्न अंतरिक्ष में नहीं रह गया है वर्तमान मिलान किया जा करने के लिए।
केवल कुछ आदेश (N
, H
और G
) पैटर्न/होल्ड स्पेस में नई पंक्तियों को संरक्षित करते हैं।
N
पैटर्न अंतरिक्ष के लिए एक नई पंक्ति संलग्न कर देता है और फिर अगले रेखा भी संलग्न।H
बिल्कुल वही करता है सिवाय इसके कि यह होल्ड स्पेस पर कार्य करता है।G
पैटर्न स्थान पर एक नई लाइन जोड़ता है और फिर होल्ड स्पेस में जो कुछ भी जोड़ता है उसे जोड़ता है। sed G file
प्रत्येक पंक्ति के बाद एक खाली पंक्ति सम्मिलित होगा:
पकड़ अंतरिक्ष खाली जब तक आप इसे में कुछ जगह तो है।
sed 'G;G' file
डाल देगा 2 खाली लाइनों आदि आदि
कैसे दो एसईडी कॉल के बारे में:
$ echo -e 'one\ntwo\nthree' | sed 's/two//' | sed '/^$/d'
one
three
('दो' पहले तो रिक्त पंक्ति से छुटकारा पाने से छुटकारा पाने के)
वास्तव में, मैं पर्ल एक-लाइनर्स के लिए अजगर से अधिक पसंद करते हैं:
$ echo -e 'one\ntwo\nthree' | perl -pe 's/two\n//'
one
three
से टिप के लिए केएस, लेकिन मुझे 'विम' में आराम महसूस नहीं होता है (मैं नया लिनक्स उपयोगकर्ता हूं) AFAIK ऑपरेटर एम/एम का इस्तेमाल मल्टीलाइन मोड – theta
पर स्विच करने के लिए 'sed' को बताने के लिए किया जाता है, मैंने अभी आपके संपादित समाधान को देखा है। क्रिप्टिक लगता है लेकिन मुझे लगता है कि यह सही जवाब है। धन्यवाद – theta
@zetah 'सब कुछ 'होल्ड-स्पेस' पर रखें, फिर इसे प्राप्त करें, और प्रतिस्थापन करें। – kev