সেড নিউলাইন চরিত্রটি অপসারণ করতে ব্যর্থ


12

আমি sedবেশ কিছুদিন ধরে ব্যবহার করছি তবে এখানে এমন এক দ্যুতি ছড়িয়েছে যার সাথে আমি সমাধান করতে পারছি না।

আমাকে আসল কেস দিয়ে আমার সমস্যাটি ব্যাখ্যা করতে দিন।


1 ম দৃশ্য

printf "ls" | xclip -selection clipboard
echo "ls" | xclip -selection clipboard

প্রথম কমান্ডে, আমি printfআউটপুটটি পাইপ করি xclipযাতে এটি ক্লিপবোর্ডে অনুলিপি হয়। এখন, printfবিপরীতে echoডিফল্টরূপে শেষে একটি নতুন লাইন not োকানো হয় না। সুতরাং, আমি যদি এই বিষয়বস্তুকে টার্মিনালে পেস্ট করি তবে অনুলিপি করা lsকমান্ডটি স্বয়ংক্রিয়ভাবে চলবে না।

দ্বিতীয়টিতে, শেষে একটি নতুন লাইন রয়েছে, সুতরাং ক্লিপবোর্ডের সামগ্রীটি আটকানোও ক্লিপবোর্ডে কমান্ড চলমান in

এটি আমার পক্ষে অযাচিত। সুতরাং, আমি নতুন লাইনটি ব্যবহার করে মুছে ফেলতে চেয়েছিলাম sed, তবে এটি নীচে দৃশ্যে বর্ণিত হিসাবে ব্যর্থ হয়েছে।

সিন # 2

echo "ls" | sed -r 's/\n//g' | xclip -selection clipboard

ক্লিপবোর্ডের সামগ্রীগুলিতে এখনও নতুন-লাইন রয়েছে। আমি যখন এটি টার্মিনালে পেস্ট করব, কমান্ডটি স্বয়ংক্রিয়ভাবে চলমান।

আমিও গাড়ি ফেরত চরিত্র সরানোর চেষ্টা \r। তবে নাদা। দেখে মনে হচ্ছে আমি এখানে খুব গুরুত্বপূর্ণ / বেসিক কিছু অনুপস্থিত।

উত্তর:


16

sedউপর delimits \newlines - তারা সবসময় ইনপুটের মুছে এবং আউটপুট উপর reinserted করছে। নেই কখনো একটি \nএকটি ewline চরিত্র sedপ্যাটার্ন স্থান যা একটি সম্পাদনা আপনার তৈরি করা ফলে ঘটেনি। নোট: গনুহ বাদ দিয়ে sed'র -zমোড ...

শুধু ব্যবহার করুন tr:

echo ls | tr -d \\n | xclip -selection clipboard

বা, আরও ভাল, sedপুরোপুরি ভুলে যান :

printf ls | xclip -selection clipboard

এটি সমস্ত নিউলাইনগুলি সরিয়ে ফেলবে , প্রায়শই generate-text | xclipক্ষেত্রে কাম্য নয় । এই উত্তরটি কেবল সর্বশেষ নিউলাইনটি সরিয়ে দেয়।
টম হেল

7

সিড সহ অনেকগুলি পাঠ্য প্রক্রিয়াকরণের সরঞ্জামগুলি নিউলাইন চরিত্রটি বাদ দিয়ে লাইনের সামগ্রীতে কাজ করে। একটি লাইন প্রক্রিয়া করার সময় প্রথম জিনিসটি সিডটি শেষ হয় নতুন লাইনটি সরিয়ে ফেলা হয়, তারপরে এটি স্ক্রিপ্টের কমান্ডগুলি কার্যকর করে এবং প্রিন্ট আউট করার সময় এটি একটি চূড়ান্ত নিউলাইন যুক্ত করে। সুতরাং আপনি সেড দিয়ে নিউলাইনটি সরাতে পারবেন না।

সমস্ত নতুন লাইনগুলি সরাতে, আপনি এর trপরিবর্তে ব্যবহার করতে পারেন :

echo "ls" | tr -d '\n' | xclip


4

-Z বিকল্পটি পাস করে আপনি নতুন লাইনে সেডে প্রতিস্থাপন করতে পারেন ।

sed -z 's/\n/ /g'

সেড ম্যান পৃষ্ঠা:

-z, --nul- ডেটা NU টি অক্ষর দ্বারা পৃথক লাইন


এটি সমস্ত নতুন লাইনগুলি সরিয়ে ফেলবে , যা সাধারণত | xclipক্ষেত্রে পছন্দ হয় না ।
টম হেল

2

আপনি যদি ক্লিপবোর্ডে কেবল কমান্ড রাখেন

echo -n "ls " | xclip -selection clipboard

যদি আপনাকে অতিরিক্ত জটিল রূপান্তর করতে হয় তবে

echo "ls  " | perl -pe 's/\n//' | xclip -selection clipboard

হুম। মসৃণ সমাধান। আমি অনুমান করি রেজেেক্সের জন্য পার্ল বা অজগর থেকে যাওয়ার সম্ভবত সময় এসেছে।
শিবমস

3
@ শিভামস - perlএবং pythonউভয়ই সঠিকভাবে ব্যবহার করা যেতে পারে তার চেয়ে অনেক ধীর গতিরsed । যদিও এটি সঠিকভাবে ব্যবহার করতে শেখা মূল বিষয়।
মাইক্রজারভ

@ মিমকিজার - আমি সম্মত; oneliner সেড জন্য বিশেষ দুর্দান্ত। যদি রূপান্তরগুলি আরও জটিল হয়ে উঠতে থাকে তবে আমি পার্ল / পাইথন / গাওককে পছন্দ করি।
জাজোও

1
@ জাজো: আপনার পছন্দটি আপনার নিজস্ব, তবে sedকেবলমাত্র আপনার ওয়ান- লাইনারগুলি পরিচালনা করার চেয়ে অনেক বেশি কিছু করতে পারে এবং আপনি উল্লেখ করেছেন এমন অন্যান্য সরঞ্জামগুলির তুলনায় এটি সম্ভবত এত দ্রুত করতে পারে।
মাইকজার্ভ

1
@ মাইকজারভ - আরও একবার, আমি আপনার সাথে একমত কিছু বছর আগে আমার একটি অনুবাদ সিস্টেম EN-PT সেডে লেখা ছিল (20000 s /.../....//), সেড দ্বারা উত্পাদিত! এবং এটা কাজ করে! পরে এটি পার্ল হয়ে যায়, অ্যারে, হ্যাশগুলি, ফাংশনগুলি, প্যাকেজগুলি এবং সিপিএএন থাকা।
জাজাও

1

কেবলমাত্র সর্বশেষ নিউলাইনটি সরাতে , এর মাধ্যমে পাইপ করুন:

sed -z '$ s/\n$//'

sed\0প্রবাহকারীর NULমাধ্যমে সেট করা থাকলে স্ট্রিমের শেষের শেষে একটি যুক্ত করবে না -z, যেখানে একটি পসিক্স পাঠ্য ফাইল তৈরি করতে (একটিতে সংজ্ঞায়িত \n), এটি সর্বদা \nছাড়াই একটি চূড়ান্ত আউটপুট তৈরি করবে -z

উদাহরণ:

$ { echo foo; echo bar; } | sed -z '$ s/\n$//'; echo tender
foo
bartender

এবং কোন NULযোগ প্রমাণিত :

$ { echo foo; echo bar; } | sed -z '$ s/\n$//' | xxd
00000000: 666f 6f0a 6261 72                        foo.bar

করার একাধিক চিহ্ন নতুন লাইন অপসারণ , নল মাধ্যমে:

sed -Ez '$ s/\n+$//'
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.