'1! G; h; $! D' কমান্ড কীভাবে কোনও ফাইলের বিষয়বস্তুগুলিকে বিপরীত করে?


20

আমার প্রশ্নটি বিপরীত গ্রেপিংয়ের এই প্রশ্নের জন্য এই উত্তরেsed প্রদত্ত-নির্দিষ্ট সমাধানের সাথে সম্পর্কিত । / সমাধান যে আমি অর্থোদ্ধারে করতে পারছি না এক অনুসরণ করছে:sedgrep

sed '1!G;h;$!d' file

কেউ কি এই আদেশটি ব্যাখ্যা করতে পারেন?

আমি ষষ্ঠ (এম) জ্ঞান থেকে জানি যে জি ফাইলের শেষ লাইনটিকে বোঝায় এবং সেজে একটি ঠুং ঠুং শব্দ (!) এর পরে একটি ঠিকানার কাজটি কিছুটা ঠিক grep -vএমনভাবে বলা হয় যে এটি সেই লাইনের সাথে মেলে না। তবে সামগ্রিকভাবে উপরের ইনলাইন সেড স্ক্রিপ্টটি আমার বাইরে।


3
... খুব ধীরে ধীরে ...
— mikeserv

1
মাইকজারভের ইঙ্গিত হিসাবে একটিকে লক্ষ্য করা উচিত যে এই কৌতুকপূর্ণ sedরেসিপিটি কোনও ফাইলের লাইনগুলিকে বিপরীত করার জন্য অত্যন্ত অযোগ্য পদ্ধতি (O (n ^ 2/2) জটিলতা)। বিপুল সংখ্যক লাইনযুক্ত ফাইলগুলির জন্য এটি নিষিদ্ধভাবে ধীর হবে। আরও বেশি দক্ষ লাইন-অর্ডার বিপরীত বিকল্পের জন্য tacজিএনইউ কোর্টিল থেকে দেখুন ।
— আরিফেল

উত্তর:


35

এটি লাইন দ্বারা ফাইল লাইন বিপরীত।

সেড '1! জি; এইচ; d! ডি' ফাইল

প্রথমত, sedএকটি হোল্ড স্পেস এবং একটি প্যাটার্ন স্পেস রয়েছে । সেই নির্দিষ্ট কমান্ডটিতে মনোনিবেশ করার আগে আমাদের তাদের মধ্যে পার্থক্য করতে হবে।

যখন sedএকটি নতুন লাইন পড়ে, এটি প্যাটার্ন স্পেসে লোড করা হয়। অতএব, নতুন স্পেসটি প্রক্রিয়াকৃত হওয়ার সাথে সাথে সেই স্থানটি ওভাররাইট করা হবে। অন্যদিকে, হোল্ড স্পেসটি পুরো প্রক্রিয়াজাতকরণের সাথে সামঞ্জস্যপূর্ণ এবং পরে ব্যবহারের জন্য মানগুলি সেখানে সংরক্ষণ করা যেতে পারে।


আদেশটি:

এই বিবৃতিতে 3 কমান্ডের বর্ণনা দেয়া হলঃ 1!G, hএবং$!d

  • 1!Gএর অর্থ Gহ'ল কমান্ডটি প্রথম লাইনের ব্যতীত প্রতিটি লাইনে কার্যকর করা হয় ( !অগ্রাহ্য করে 1)। Gবিত্ত যোগ কি প্যাটার্ন মহাকাশ হোল্ড স্থান রয়েছে।

  • hপ্রতিটি লাইনে প্রযোজ্য এটি হোল্ড স্পেসে প্যাটার্ন স্পেসটি অনুলিপি করে (এবং এটি ওভাররাইট করে)।

  • $!dশেষটি ব্যতীত প্রতিটি লাইনের ক্ষেত্রে প্রযোজ্য ( $শেষ লাইনের প্রতিনিধিত্ব করে, !এটিকে উপেক্ষা করে)। dলাইনটি মুছে ফেলার আদেশ (প্যাটার্ন স্পেস)।


  1. এখন, যখন প্রথম লাইন পাঠ করা হয়, sedexecutes hকমান্ড। প্রথম লাইনটি হোল্ড স্পেসে অনুলিপি করা হয়। তারপরে এটি মুছে ফেলা হয়, কারণ এটি $!শর্তের সাথে মেলে । sedদ্বিতীয় লাইনের সাথে অবিরত।
  2. দ্বিতীয় লাইন শর্তের সাথে মেলে 1!(এটি প্রথম লাইন নয়) এবং তাই হোল্ড স্পেস (যার প্রথম লাইন রয়েছে) প্যাটার্ন স্পেসে যুক্ত করা হয় (যার দ্বিতীয় লাইন রয়েছে)। এর পরে, প্যাটার্ন স্পেসে, এখন দ্বিতীয় লাইন রয়েছে তার পরে প্রথম লাইনটি, একটি নতুন লাইন দ্বারা বিস্মৃত। এখন, hকমান্ড প্রযোজ্য (প্রতিটি লাইনের মতো); প্যাটার্ন স্পেসে থাকা সমস্ত হোল্ড স্পেসে অনুলিপি করা হয়। তৃতীয় বিবৃতি ( $!d) প্রযোজ্য: লাইনটি প্যাটার্ন স্পেস থেকে মুছে ফেলা হয়েছে।
  3. পদক্ষেপ 2 এখন সমস্ত লাইন দিয়ে সম্পন্ন করা হয়। আমরা শেষ লাইনে চলে যাই।
  4. শেষ লাইনে ( $) প্রায় সমস্ত ধাপ 2 সম্পূর্ণ হয়ে গেছে, তবে মুছার অংশটি ( d) নয়। sed, যখন ছাড়া আহ্বান করা হয় -n, প্রতিটি ইনপুট লাইনের প্রক্রিয়া শেষে স্বয়ংক্রিয়ভাবে প্যাটার্ন স্পেসটি মুদ্রণ করে। সুতরাং, মুছে ফেলা না হলে, প্যাটার্ন স্পেসটি মুদ্রিত হয়। এতে এখন বিপরীত ক্রমে সমস্ত লাইন রয়েছে ।

1
@ গীক না, hকমান্ডটি হোল্ড স্পেসে প্যাটার্ন স্পেসটি অনুলিপি করে, যা sedশেষ অবধি অব্যাহত থাকে । স্ক্রিপ্ট শেষ হওয়ার পরে সবকিছু সাফ হয়ে যায়, কারণ বাইনারি বের হয়।
— বিশৃঙ্খলা

2
আমরা কি ভিএম-এর জন্য রেজিস্টারের মতো হোল্ড স্পেসের কথা ভাবতে পারি? তারাও কি নম্বরযুক্ত? নাকি তাদের মধ্যে একটি মাত্র আছে?
— গিক

2
@ গিক ইন sedকেবল একটি হোল্ড স্পেস আছে। এটি ভেরিয়েবলের মতো যাতে কিছু থাকতে পারে।
— বিশৃঙ্খলা

1
@ ব্যবহারকারী 1717828 প্রক্রিয়া করা হলে আমরা প্রথম লাইনটি মুদ্রণ করা হত না। যেহেতু সেডের সাথে অনুরোধ করা হয়নি সেহেতু -nআমাদের সর্বশেষটি বাদে প্রতিটি লাইন মুছতে হবে। শেষ লাইনে সেড হোল্ড স্পেস থেকে প্যাটার্ন স্পেস পর্যন্ত সমস্ত কিছু সংযোজন করে। এবং dআদেশটি কার্যকর করা হবে না বলে লাইনটি মুদ্রিত হয়েছে (এই লাইনে এখন পুরো ফাইলটি বিপরীত রয়েছে)।
— বিশৃঙ্খলা

1
(১) ওপি'র উপ-প্রশ্ন / পর্যবেক্ষণ (মন্তব্যে) হ'ল, "সুতরাং শেষ লাইনেরh কমান্ডটি কোনও নো-অপশনকে সাজানো” "(অতিরিক্ত জোর দিয়ে, এবং সামান্য প্যারাফ্রেস করা হয়েছে)। সে সঠিক; যখন প্রক্রিয়াকরণ হচ্ছে গত ইনপুট লাইন , হোল্ড স্থান (অর্ডার প্যাটার্ন স্থান থেকে এটি যোগ করার জন্য) সার্চ, এবং তারপর কপি হোল্ড স্থান, প্যাটার্ন স্থান যা আবার রেফারেন্সড হয় না । আমরা ঠিক বলতে পারি বা বলতে পারি । (২) আমরা বলার দ্বারা ব্যবহার এড়াতে পারি । sedGhsed 'G;$!h;$!d'sed 'G;$!{h;d}'dsed -n 'G;h;$p'
— স্কট
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.