এর অর্থ কী: ক; $! এন; একটি সেড কমান্ডে?


11
$ (echo hello; echo there) | sed ':a;$!N;s/\n/string/;ta'
hellostringthere

উপরের sedকমান্ডটি নতুন স্ট্রিং চরিত্রটিকে "স্ট্রিং" দিয়ে প্রতিস্থাপন করে। তবে আমি :a;$!N;s/\n/string/;taএকক উদ্ধৃতিগুলির মধ্যে এর অর্থ জানি না । আমি মাঝের অংশটি জানি s/\n/string/। তবে আমি প্রথম ( :a;$!N;) এবং শেষ ( ta) অংশের ফাংশন জানি না ।



শেষ অংশ সম্পর্কে কি?
অবিনাশ রাজ

"বিকল্প" কমান্ডটি পরিবর্তিত প্যাটার্ন স্পেসে পরিবর্তিত হলে "টি" কমান্ড একটি নামযুক্ত লেবেলে শাখা দেয়।
জিয়াওডংজি

উত্তর:


17

এগুলি হ'ল, স্বীকৃত ক্রিপ্টিক, sedআদেশগুলি। বিশেষত (থেকে man sed):

:
         বি এবং টি কমান্ডের জন্য লেবেল লেবেল করুন।

t লেবেল
         যদি /// সর্বশেষ ইনপুট লাইনটি পড়ার পর থেকে এবং শেষ টি বা টি কমান্ডের পরে সফল প্রতিস্থাপনের কাজ করে থাকে তবে লেবেলে শাখা; যদি লেবেল বাদ দেওয়া হয়, স্ক্রিপ্টের শেষে শাখা।

n এন প্যাটার্ন স্পেসে পরবর্তী লাইনটি ইনপুট পড়ুন / যুক্ত করুন।

সুতরাং, আপনার পোস্ট করা স্ক্রিপ্টটি ভেঙে ফেলা যায় (পঠনযোগ্যতার জন্য ফাঁকা স্থানগুলি):

sed ':a;  $!N;  s/\n/string/;  ta'
     ---  ----  -------------  --
      |     |        |          |--> go back (`t`) to `a`
      |     |        |-------------> substitute newlines with `string`
      |     |----------------------> If this is not the last line (`$!`), append the 
      |                              next line to the pattern space.
      |----------------------------> Create the label `a`.

মূলত, এটি যা করছে তা সিউডোকোডে লেখা যেতে পারে

while (not end of line){
    append current line to this one and replace \n with 'string'
}

আরও জটিল ইনপুট উদাহরণ সহ আপনি এটি আরও কিছুটা বুঝতে পারবেন:

$ printf "line1\nline2\nline3\nline4\nline5\n" | sed ':a;$!N;s/\n/string/;ta'
line1stringline2stringline3stringline4stringline5

কেন !$প্রয়োজন তা আমি সত্যিই নিশ্চিত নই । আমি যতদূর বলতে পারি, আপনি একই আউটপুট পেতে পারেন

printf "line1\nline2\nline3\nline4\nline5\n" | sed ':a;N;s/\n/string/;ta'

1
! $ হ'ল সর্বশেষ নতুন লাইনের সাথে মেলে না, আইএমও।
ব্রায়াম

@ ব্রাইয়াম সে সম্পর্কে খুব বেশি নিশ্চিত নন, এটিও $!নয় !$। তবে এটিও হতে পারে !Nএবং নাও হতে পারে $!
টেরডন

আমি টেক্সিনফোর পৃষ্ঠাটি বিশ্লেষণ করার চেষ্টা করছিলাম তবে !Nবা এর কোনও উল্লেখ পাওয়া যায় নি $!। সুতরাং, আমি এখনও আমার চিন্তাভাবনাটি রাখি যা দেখছে যে শেষ লাইনটি নতুন লাইন বা ইওএফ কিনা।
ব্রায়াম

4
আমি মনে করার চেষ্টা করুন $!একটি পোস্টসাফিক্স সম্পূরক অপারেটর সঙ্গে একটি ঠিকানা 'সীমার' হিসেবে - তাই $!N(করতে Nঠিকানার জন্য ছাড়া সব জায়গায় $) সত্যিই ভালো কিছু হিসাবে একই বাক্য গঠন হয় m,n!d(লাইন ছাড়া ডিলিট সবকিছু mকরতে n)।
স্টিল্ড্রাইভার

:gotoলেবেলের অ্যানালগ , এবং প্রকৃতপক্ষে থম্পসন শেলটিতে গোটো লেবেল :ব্যবহৃত হত , তাই সেদিন
সেড

0

আমি এই উত্তর পোস্ট যেহেতু আমি সম্পর্কে বিভ্রান্তির দেখতে অনেকটা কেন শেষ লাইনটি বাদ দেওয়া হয়েছে যখন নির্বাহ N(লাইন অ্যাড্রেসিং স্ট্রিং মাধ্যমে $!) এবং কারণ ওপি অর্থ সম্পর্কে বিভ্রান্ত হয় :a;$!N; একটি sed কমান্ড না শুধুমাত্র মধ্যে নির্দিষ্ট তিনি পোস্ট ।

ঠিক আছে, প্রস্তাবিত উদাহরণগুলিতে (ওপি এবং @terdon দ্বারা) $!Nপরিবর্তে ব্যবহারের সুবিধাটি Nস্পষ্ট নয়, যেহেতু কমান্ডের পরে শেষ লাইনে কোনও "গুরুত্বপূর্ণ" (পড়া চালিয়ে যান) কমান্ড সঞ্চালিত হয় না N। (প্রকৃতপক্ষে, যদি কেউ সেই লাইনের ঠিকানাটি বন্ধ করে দেয় তবে ফলাফলটি একই)

আরও জটিল উদাহরণে (উদাহরণস্বরূপ, this sentenceএকটি ফাইলের বিকল্প হিসাবে দুটি শব্দ কখনও কখনও এক লাইনে এবং কিছু সময় দুটি লাইনে উপস্থিত হয়) Nকমান্ডের জন্য শেষ লাইনটি বাদ দেওয়া অত্যন্ত গুরুত্বপূর্ণ হতে পারে! শেষ লাইনটি বাদ না থেকে থাকে তবে নির্বাহ উপর Nএটিতে, sedহিট EOFকরে প্রস্থান করে অবিলম্বে পরবর্তী সব কমান্ড (কমান্ড শাখাবিন্যাস পাশাপাশি, যথা প্রতিরোধ tএবং b) নিষ্পন্ন করা হবে।

দেখানো খুব সরল উদাহরণগুলিতে, আমরা নিরাপদে সরিয়ে ফেলতে পারি $!এবং sedকার্যকর Nকরতে ব্যর্থ sহতে পারি এবং প্রত্যাবর্তিত কমান্ড এটি কার্যকর করা হলে কিছুই করবে না, কারণ \nমিলের কিছু নেই।

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