यह प्रश्न स्पष्ट रूप से बताता है कि शीर्षक में रिक्त स्थान होंगे। सुरक्षा के लिए, मैं मान रहा हूं कि शीर्षक में डॉट्स (अवधि) हो सकते हैं; उदाहरण के लिए, "3.14159 का इतिहास" या "डॉ। डुलिटस डिस्कवरी ”। मेरे उत्तर मान लेते हैं कि कुछ ऐसा चरित्र है जो कभी भी सामग्री की तालिका में प्रकट नहीं होगा; विशेष रूप से, वे मानते हैं कि यह है @
। यदि आपके पास @
अपनी तालिका में, (जैसे कुछ चरित्र है कि कभी नहीं दिखाई देता है साथ बदलें #
, ^
, _
, |
, आदि)। यदि आप वास्तव में प्रत्येक ASCII वर्ण का उपयोग करते हैं, तो आपको वर्ण अनुक्रम का उपयोग करने की आवश्यकता हो सकती है, जैसे <@>
।
इसके साथ करने के तीन तरीके sed
:
लूप:
sed 's/\(.*\)\( \)/\1@\2/; :loop; s/ @/ @./; t loop; s/@//'
s/\(.*\)\( \)/\1@\2/
लाइन पर अंतिम स्थान पाता है और @
इससे पहले एक आवेषण करता है ।
:loop
एक मील मार्कर की तरह एक लेबल है।
s/ @/ @./
(यह s/␣␣@/␣@./
, गैर-अस्पष्टता के लिए) कहता है, यदि इससे पहले दो स्थान हैं, तो @
उन्हें ␣.
(स्थान और डॉट) से बदलें , और @
उनके बीच स्थानांतरित करें।
t loop
कहते हैं, यदि उपरोक्त प्रतिस्थापन सफल हुआ, तो :loop
मार्कर पर वापस जाएं और दोहराएं। अन्यथा, जारी रखें
s/@//
, जो निकालता है @
।
तो foo bar
आपके टेबल की लाइन इस प्रकार प्रोसेस की जाएगी:
प्रारंभिक मूल्य: फू बार url3
s / \ ((। * \) \ (\) / \ 1 @ \ 2 / फू बार @ url3
s / @ / @ /। / फू बार @। URL3
s / @ / @ /। / फू बार @ .. url3
s / @ / @ /। / फू बार @ .. url3 (प्रतिस्थापन विफल रहता है, इसलिए लूप न करें)
s / @ // फू बार .. url3
अंतिम उत्पादन: फू बार .. url3
भारी संख्या:
sed 's/\(.*\)\( \)/\1@@@@@@@@@@@@@@@@@@@@\2/; s/ [ @]\{20\}/ /; s/@/./g'
s/\(.*\)\( \)/\1@@@@@@@@@@@@@@@@@@@@\2/
s
पहले समाधान में
पहले उपकमांड के समान है ; यह लाइन पर अंतिम स्थान पाता है और @
इससे पहले 20 वर्णों की एक स्ट्रिंग सम्मिलित करता है। यह वास्तव में एक ऐसी संख्या होनी चाहिए जो कम से कम उतनी बड़ी हो जितनी अधिकतम डॉट्स आपको कभी भी एक पंक्ति में सम्मिलित करने की आवश्यकता होगी; उदाहरण के लिए, 80. 80 @
वर्णों की एक स्ट्रिंग का प्रबंधन अजीब होगा; आप इसके साथ प्रतिस्थापित करना चाह सकते हैं
s/\(.*\)\( \)/\1<@><@><@><@><@>\2/; s/<@>/@@@@@@@@/g
जो पाँच <@>
अनुक्रमों की एक स्ट्रिंग सम्मिलित करता है , और फिर उनमें से प्रत्येक को 16 @
वर्णों की एक स्ट्रिंग के साथ बदल देता है , जिसके परिणामस्वरूप 5 × 16/80 @
वर्ण होते हैं।
s/ [ @]\{20\}/ /
20 लगातार वर्णों की एक स्ट्रिंग पाता है जो या तो एक स्थान या एक है @
, जो एक स्थान से पहले है, और इसे केवल पूर्ववर्ती स्थान के साथ बदल देता है। 20
पिछले चरण से संख्या के साथ बदलें ।
s/@/./g
प्रत्येक @
को एक बिंदी के साथ बदल देता है ।
तो foo
आपके टेबल की लाइन इस प्रकार प्रोसेस की जाएगी:
Initial value: foo url1
s/\(.*\)\( \)/\1@@@@...@@@@\2/ foo @@@@@@@@@@@@@@@@@@@@ url1
s/ [ @]\{20\}/ / _[↑↑↑↑↑↑remove↑↑↑↑↑↑]
foo @@@@@@ url1
s/@/./g foo ...... url1
"होल्ड स्पेस" का उपयोग करें:
sed 's/.*[^ ] /&@/; h; s/ /./g; s/\(\.*\)\./\1 /; x; G; s/@.*@//'
s/.*[^ ] /&@/
है समान पिछले आदेशों के लिए; यह शीर्षक के अंत का पता लगाता है - सटीक होने के लिए, अंतिम स्थान जहां एक गैर-रिक्त चरित्र के बाद एक स्थान है - और @
इसके बाद आवेषण ।
h
होल्ड स्पेस पर लाइन कॉपी करता है।
s/ /./g
सभी स्थानों को डॉट्स के साथ पंक्ति में बदल देता है।
s/\(\.*\)\./\1 /
एक स्थान के साथ अंतिम बिंदु को बदलता है। (इसे बदलने की आवश्यकता होगी यदि URL में डॉट्स हो सकते हैं, जो मुझे लगता है कि संभावना है।)
x
पैटर्न स्पेस और होल्ड स्पेस का आदान-प्रदान करता है।
G
होल्ड स्पेस को पैटर्न स्पेस में जोड़ता है। अब हमारे पास अनिवार्य रूप से पंक्ति की दो प्रतियां हैं।
s/@.*@//
पहली प्रति का पहला भाग और दूसरी प्रति का दूसरा भाग रखता है, बीच में सामान से छुटकारा।
Initial value: foo bar url3
Pattern space Hold space
s/.*[^ ] /&@/ foo bar @ url3
h foo bar @ url3 foo bar @ url3
s/ /./g foo.bar.@...url3 foo bar @ url3
s/\(\.*\)\./\1 / foo.bar.@.. url3 foo bar @ url3
x foo bar @ url3 foo.bar.@.. url3
G foo bar @ url3 foo.bar.@.. url3 foo.bar.@.. url3
s/@.*@// foo bar .. url3 foo.bar.@.. url3
Final output: foo bar .. url3