केवल एक स्थान के साथ एक वाक्य के अंत के बाद दो स्थानों के सभी घटनाओं को बदलें


9

मैं एक सेड कमांड के साथ नियमित भावों को शामिल करने में फंस गया हूं।

प्रश्न: मैं एक वाक्य के अंत के बाद दो स्थानों की सभी घटनाओं को केवल एक बार बदलना चाहता हूं ।

मैंने जो किया था यह रहा:

sed 's/^ $/^$/' file  

और यह वाक्य समाप्त होने के बाद एक स्थान के साथ दो स्थानों को प्रतिस्थापित नहीं करता था।

आउटपुट मुझे मिलता है:

This is the output.  Hello Hello

आउटपुट मुझे चाहिए:

This is the output. Hello Hello

@Rahul मैं चाहता हूं कि वाक्य समाप्त होने के बाद एक बार इसमें स्पेस हो। पहले वाक्य के रूप में दो स्थान नहीं। मैं दूसरा वाक्य आउटपुट चाहता हूं
ज़ीउस

@ जसेन द्वारा उत्तर सही है। BTW, आपके द्वारा कोशिश की गई कमांड का अर्थ है: एक पंक्ति को एक खाली लाइन द्वारा केवल एक व्हाट्सएप से युक्त करें। यही कारण है कि यह वह नहीं करता था जो आप चाहते थे।
रेक्सकोगिटंस

1
यहां डालें: एकल बनाम डबल अंतरिक्ष के खिलाफ युद्ध की पूर्ण विराम के बाद
Gerrit

@gerrit यह युद्ध कुछ 20 साल पहले खो गया था। ;)
h4ckNinja

जवाबों:


12
 sed 's/\.   */. /g' < file

डॉट के स्थान पर दो या दो से अधिक रिक्त स्थान के साथ डॉट के बाद एकल स्थान होता है।


आपकी कमांड वास्तव में पूरे पैराग्राफ के लिए काम करती है। ठीक यही मैं चाहता था। धन्यवाद!
ज़ीउस

या sed -r 's/\.\s+/. /g' fileGNU sed के साथ ...
Sundeep

@ स्थानिक उपयोग के sed -Eबजाय sed -r। यह GNU sed और * BSD sed (inc। Mac OS X) और कुछ अन्य लोगों के साथ काम करता है। यह POSIX में मानक के रूप में शामिल होने के लिए निर्धारित है "अब जल्द ही असली"।
कैस

@cas मुझे कुछ समय पहले याद आया, मैंने sed -Eइस साइट पर किसी को सुझाव दिया था जो काम नहीं करता था लेकिन sed -rकाम किया था। मैंने अकेले GNU सेड के साथ काम किया है, इसलिए POSIX और अन्य विविधताओं पर कोई विचार नहीं है .. भविष्य में इस विवरण को शामिल करने की कोशिश करूंगा। , धन्यवाद :)
सुदीप

यह जीएनयू सेड का पुराना संस्करण रहा होगा। उन्होंने -Eअभी कुछ समय के लिए समर्थन किया है (कम से कम 2011 से, लेकिन आदमी और जानकारी के पेज अभी भी केवल उल्लेख करते हैं -r)
cas

13

आपकी sedआज्ञा 's/^ $/^$/'वह नहीं करेगी जो आप चाहते हैं। यह सिर्फ सभी लाइनों को प्रतिस्थापित करता है जिसमें एक पंक्ति के साथ एक स्थान होता है ^$

वाक्य के अंत में कौन से वर्ण अंकित हैं, इस पर निर्भर करें:

sed -e 's/\([.?!]\) \{2,\}/\1 /g' <file

यह 2 या अधिक स्थानों को बाद में ., ?या !केवल एक स्थान के साथ बदल देगा ।


1
को छोटा किया जा सकता हैsed -r 's/([.?!])\s+/\1 /g' file
सुन्दीप

धन्यवाद। लेकिन क्या आप विस्तार से बताएंगे कि आपने इतने गोल, चौकोर कोष्ठक क्यों इस्तेमाल किए? यह थोड़ा भ्रमित करने वाला है।
ज़्यूस

1
@spasic: यह केवल GNU सेड के साथ काम करता है, सरलीकृत संस्करण के साथ अद्यतन किया जाता है।
congonglm

@Zeus: यह डिफ़ॉल्ट वाक्य के साथ मानक वाक्यविन्यास है।
congonglm

1
नहीं, मूल sedसंपादन स्क्रिप्ट शाब्दिक स्ट्रिंग के साथ एकल स्थान वाली किसी भी पंक्ति को प्रतिस्थापित करेगी ^$
Kusalananda

7

यह वह है जिसे आप ढूंढ रहे हैं,

tr -s " " <filename

नमूना,

$ echo "This is the output.  Hello Hello" | tr -s "[:blank:]"
This is the output. Hello Hello

का उपयोग कर sed,

$ echo "This is the output.  Hello Hello" | sed 's/\. \+/. /g'
$ echo "This is the output.  Hello Hello" | sed 's/\. \{1,\}/. /g'
This is the output. Hello Hello

2
ठीक है, यह धन्यवाद काम कर रहा है, लेकिन मुझे sed कमांड शामिल करने की आवश्यकता है। उपर्युक्त के समान कुछ बताएं, जैसे कि प्रतिस्थापन, पाठ बदलना आदि।
ज़ीउस

2
मुझे इस ट्र फीचर के बारे में पता नहीं था,
जैसन

3
यह दृष्टिकोण दो स्थानों की जगह लेगा जो वाक्य के अंत में नहीं हैं।
congonglm
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.