বাক্যটি শেষ হওয়ার পরে দুটি ফাঁকের সমস্ত উপস্থিতি কেবল একটি স্পেস দিয়ে প্রতিস্থাপন করুন


9

আমি একটি সেড কমান্ড সহ নিয়মিত এক্সপ্রেশন সহ আটকে আছি।

প্রশ্ন: আমি একটি বাক্য শেষ হওয়ার পরে দুটি স্পেসের সমস্ত উপস্থিতিকে কেবল একবার স্পেস দিয়ে প্রতিস্থাপন করতে চাই ।

আমি যা করেছি তা এখানে:

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

বাক্যটি শেষ হওয়ার পরে এটি একটি জায়গার সাথে দুটি স্পেস প্রতিস্থাপন করে নি।

আউটপুট আমি পাই:

This is the output.  Hello Hello

আউটপুট আমি চাই:

This is the output. Hello Hello

@ রাহুল আমি বাক্যটি শেষ হওয়ার পরে একবার ফাঁকা রাখার সাথে আউটপুট চাই। প্রথম বাক্যে দুটি স্পেস নয়। আমি দ্বিতীয় বাক্যটির আউটপুট চাই
জিউস

@ জেসেনের উত্তর সঠিক। বিটিডাব্লু, আপনি যে কমান্ডটি চেষ্টা করেছেন তার অর্থ: খালি রেখার দ্বারা কেবল একটি একক শ্বেত স্পেস নিয়ে গঠিত একটি লাইন প্রতিস্থাপন করুন। এই কারণেই এটি আপনি যা চান তা করেন নি।
রেক্সকোগিটানস

1
এখানে
sertোকান:

@gerrit যে যুদ্ধটি প্রায় 20 বছর আগে পরাজিত হয়েছিল। ;)
h4ckNinja

উত্তর:


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

একক স্পেসের পরে বিন্দুতে দুটি বা আরও বেশি স্পেসের পরে ডট প্রতিস্থাপন করুন।


আপনার আদেশটি পুরো অনুচ্ছেদের জন্য কাজ করে। ঠিক এটাই আমি চেয়েছিলাম। ধন্যবাদ!
জিউস

বা sed -r 's/\.\s+/. /g' fileজিএনইউ সেডের সাথে ...
সন্দীপ

sed -Eপরিবর্তে @ স্প্যাসিক ব্যবহার sed -r। এটি জিএনইউ সেড এবং * বিএসডি সেড (সহ ম্যাক ওএস এক্স) এবং আরও কয়েকজনের সাথে কাজ করে। এটি পসিক্স "শীঘ্রই বাস্তব" হিসাবে স্ট্যান্ডার্ড হিসাবে অন্তর্ভুক্তির জন্য নির্ধারিত।
কাশ

@ কেস আমার মনে আছে কিছুক্ষণ আগে, আমি sed -Eএই সাইটে কাউকে প্রস্তাব দিয়েছি যা কাজ করে নি তবে sed -rকাজ করেছে .. আমি জিএনইউ সিডের সাথে একা কাজ করেছি, সুতরাং পসিক্স এবং অন্যান্য বিভিন্নতার বিষয়ে কোনও ধারণা নেই .. ভবিষ্যতে এই বিবরণটি অন্তর্ভুক্ত করার চেষ্টা করবে না , ধন্যবাদ :)
সন্দীপ

এটি অবশ্যই জিএনইউ সেডের একটি পুরানো সংস্করণ ছিল। তারা সহায়তা করেছেন তাদের -Eবেশ এখন যখন (অন্তত 2011, কিন্তু মানুষ এবং তথ্য পৃষ্ঠা এখনও শুধুমাত্র উল্লেখ যেহেতু জন্য -r)
CA গুলির

13

আপনার sedআদেশ 's/^ $/^$/'যা চান তা করবে না। এটি কেবল সমস্ত লাইনে প্রতিস্থাপন করে একটি লাইনের সাথে একটি স্থান থাকে ^$

কোন অক্ষরের বাক্যটির শেষে চিহ্নিত করা যায় তার উপর নির্ভর করে আপনি এটি করতে পারেন:

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

এই পর 2 বা তার বেশি স্পেস প্রতিস্থাপন করবে ., ?বা !শুধুমাত্র এক স্থান সঙ্গে।


1
সংক্ষিপ্ত করা যেতে পারেsed -r 's/([.?!])\s+/\1 /g' file
সন্দীপ

ধন্যবাদ। তবে আপনি কেন দয়া করে এতগুলি বৃত্তাকার, বর্গাকার বন্ধনী ব্যবহার করলেন? এটা সামান্য বিভ্রান্তিকর।
জিউস

1
@ স্প্যাসিক: এটি কেবল জিএনইউ সিডের সাথে কাজ করা হয়েছে, সরলিকৃত সংস্করণ সহ আপডেট হয়েছে।
cuonglm

@ জিউস: এটি ডিফল্ট বিআরই সহ স্ট্যান্ডার্ড সিনট্যাক্স।
cuonglm

1
না, মূল sedসম্পাদনা স্ক্রিপ্ট আক্ষরিক স্ট্রিংয়ের সাথে একটি একক স্থান সম্বলিত যে কোনও লাইন প্রতিস্থাপন করবে ^$
কুসালানন্দ

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
ঠিক আছে, এটি ধন্যবাদ কাজ করছে, তবে আমার সেড কমান্ডটি অন্তর্ভুক্ত করা দরকার। দয়া করে উপরের মতো দেখানো মিলের মতো কিছু বলুন, যেমন বদলে দেওয়া, সেডে পাঠ্য পরিবর্তন ইত্যাদি।
জিউস

2
আমি এই টিআর বৈশিষ্ট্য সম্পর্কে অবগত ছিলাম না
জেসেন

3
এই পদ্ধতির দুটি ফাঁকা স্থান প্রতিস্থাপন করবে যা বাক্যটিরও শেষ নয়।
cuonglm
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.