'সেড' ইউটিলিটির অদ্ভুত আচরণ


1

আমি ব্যবহার করছি sed GnuWin32 বন্দর দ্বারা Windows এ। এই লিখিত সামগ্রীগুলির সাথে আমার কাছে একটি পাঠ্য ফাইল ইনপুট রয়েছে xt

ab

আমি এই সম্মিলিত কমান্ডগুলি aঅক্ষরটিকে একটি নতুন লাইনে আলাদা করতে এবং তারপরে এই aঅক্ষরটি যুক্ত লাইনটি মুছে ফেলার জন্য চেষ্টা করেছি, কারণ আমি ভেবেছিলাম কমান্ডগুলি একে অপরের পরে একের পর এক চলেছে ran

sed "s/a/\na\n/ ; /a/d" "input.txt" > "output.txt"

যাইহোক, আমি খালি একটি ফাঁকা আউটপুটটেক্সট ফাইল পেয়েছি । আমি যদি এটি দুটি পৃথক কমান্ড বিভক্ত

sed "s/a/\na\n/" "input.txt" > "output1.txt"
sed "/a/d" "output1.txt" > "output2.txt"

তারপরে সবকিছু ঠিকঠাক কাজ করে, আউটপুট 2.txt ফাইলের সাথে bঅক্ষরের একটি মাত্র লাইন থাকে । তাহলে আমি কী ভুল করেছি?

উত্তর:


3

কমান্ডটি /a/dএকটি লাইন মুছে দেয় না; এটি প্যাটার্ন স্পেস মুছে দেয়। প্রথমে কোনও প্যাটার্ন স্পেসে কেবল একটি লাইন থাকে, আপনার প্রথম বিকল্প কমান্ডটি প্যাটার্ন স্পেসটিকে দুটি লাইনে পরিণত করে। শেষ হওয়া লাইনটি সরাতে a, চেষ্টা করুন:

$ sed "s/a/a\n/ ; s/[^\n]*a\n//" "input.txt"
b

রেজেক্সের [^\n]*a\nসাথে শেষ হওয়া লাইনের সমস্ত কিছুর সাথে মিল রয়েছে a। এটি কিছুই দিয়ে প্রতিস্থাপন করা হয়।

বিকল্পভাবে, আপনি যদি প্যাটার্ন স্পেস থেকে মুছে ফেলতে চান তবে একটি লাইন সম্পূর্ণরূপে গঠিত a:

$ sed "s/a/\na\n/ ; s/\na\n//" "input.txt"
b

নথিপত্র

সেড ডকুমেন্টেশন পরিষ্কার: dকমান্ড প্যাটার্ন স্পেস মুছে দেয়।

থেকে গনুহ sed ম্যানুয়াল :

d
প্যাটার্ন স্থান মুছুন; অবিলম্বে পরবর্তী চক্র শুরু।

থেকে POSIX awk স্পেসিফিকেশন :

[2addr] d
প্যাটার্নের স্থান মুছুন এবং পরবর্তী চক্রটি শুরু করুন।

সাধারণত, একটি সেড প্যাটার্ন স্পেসে একটি একক লাইন থাকে যা ক্ষেত্রে লাইন এবং প্যাটার্ন স্পেসের মধ্যে পার্থক্য গুরুত্বহীন। তবে, অনেকগুলি উপায় রয়েছে যেমন s/a/a\n/একটি প্যাটার্ন স্পেসে একাধিক লাইন স্থাপন। এই ক্ষেত্রে, পার্থক্যটি গুরুত্বপূর্ণ।


নতুন কমান্ডের জন্য হুম ধন্যবাদ, তবে আমি এই প্রশ্নটি stackoverflow.com/questions/5410757/… থেকে দেখছি , কমান্ডটি /a/dআসলে একটি নির্দিষ্ট স্ট্রিংযুক্ত একটি লাইন মুছে ফেলবে । সুতরাং আমার আদেশগুলি প্রত্যাশার মতো কাজ করবে না কেন আপনার কোনও ধারণা আছে?
তেভ

@ তিভ এই উত্তরে প্যাটার্ন স্পেসে একটি লাইন রয়েছে isted সে কারণেই তিনি লিখেছেন যে dএকটি লাইন মুছে দেয়। যখন প্যাটার্ন স্পেসে একাধিক লাইন থাকে, তখন অবশ্যই একটি আরও সুনির্দিষ্ট হতে হবে: dপ্যাটার্নের স্থানটি মুছে দেয়। জিএনইউ ডকুমেন্টেশন এবং পসিক্স স্পেক উভয়ই এ বিষয়ে দ্ব্যর্থহীন: dকমান্ডটি প্যাটার্নের স্থানটি মুছে ফেলে। আমি ডকুমেন্টের লিঙ্কগুলির সাথে উত্তরটি আপডেট করেছি।
1024
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.