পোর্টেবল সেড-ডি সম্পর্কিত… ডিবি বা! খ?


12

ইন এই সম্পাদনাটি Stéphane Chazelas POSIXifies (আবার) আমার sedএকটি সন্নিবেশ করার মাধ্যেমে ফর্ম্যাটিং -eঅনুভূতির বিরতি এবং অন্য -eঅনুভূতির বিবৃতি। এখন, আমি কেবল তাকে মন্তব্যে কেন জিজ্ঞাসা করতে পারি, আমি মনে করি, তবে এটি ইতিমধ্যে উত্তরটির 18 নম্বর সংশোধনী এবং পূর্ববর্তী প্রায় সমস্তই ইতিমধ্যে অনুরূপ ফ্রিবিজকে ধন্যবাদ জানিয়েছে (যদি আপনি মুছে ফেলা মন্তব্যগুলি দেখতে পারেন তবে আপনি কী জানেন মানে) । এছাড়াও, আমি মনে করি যে কেন এটি সাধারণভাবে কার্যকর হতে পারে এমনভাবে এই শব্দটিকে কেন বাক্য বলার জন্য আমি যথেষ্ট তার কাছে। সুতরাং এখানে আশা করছি ...

আমি সাধারণত আমার মোট রাখতে পছন্দ sed -eএক xpressions যদি আমি পারে, কিন্তু আমি এও অনুসারী জন্য অধিক পক্ষপাত আছে বৈশিষ্ট বৈ তো, বিশেষত যখন পার্থক্য পরিমাণে হিসাবে আমি করতে কাছাকাছি যেমন <space>একটি -e। তবে আমার কেন করা উচিত তা যদি বুঝতে না পারি তবে আমি এটি করতে পারি না । আমার বোঝার বর্তমান অবস্থার একটি সংক্ষিপ্ত রান্ডাউন এখানে দেওয়া হল:

  • ' -e 'বিরতি portably একটি জন্য স্ট্যান্ড করতে পারবেন sedস্ক্রিপ্ট \nএকটি ewline বিরতি sedকম্যান্ড-লাইন বিবৃতি ... আমি কেন সম্পর্কে বোঝা যাচ্ছে যে নেতারা ঝাপসা am

  • একটি বন্ধ যুগল sed {ফাংশন }একটি পূর্বে করা আবশ্যক \newline বিরতি এখানে বলেন:

    • <right-brace>একটি পূর্বে হইবে <newline>এবং পূর্বে বা অনুসৃত করা যেতে পারে <blank>অক্ষর।
  • একটি \newline বিরতি একভাবে এর ... কোন কাজে নিম্নলিখিত প্রয়োজন বোধ করা হয় a, b, c, i, r, t, w, অথবা :

তবে আমি কীভাবে {ফাংশন }সংজ্ঞাটি !অপারেটরের সাথে সম্পর্কিত তা বুঝতে পারি না । অনুমানের অবহেলা অপারেটরের একমাত্র উল্লেখে আমরা বলেছি:

  • এক বা একাধিক !অক্ষরের দ্বারা একটি ফাংশন আগে করা যেতে পারে , যদি ঠিকানাগুলি প্যাটার্নের জায়গাটি না নির্বাচন করে তবে ফাংশনটি প্রয়োগ করা হবে।

এর অর্থ কি এই !বোঝানো {বন্ধনী ব্যবহার করে }? আপনি কি $!কমান্ড - তারা একইভাবে দিয়ে পৃথক করা উচিৎ ' -e 'বিরতি? স্টাফেন যখন সম্প্রতি আমার উত্তর পোজিস্টাইফড করেছিলেন তখন কি এটিকেই সম্বোধন করা হয়েছিল ?

আমি মনে করি এটি হয় !নেতিবাচক অপারেটর, বা এটি bতার সম্পাদনাটিতে বর্ণিত পাল্টা বিবৃতি - অথবা সম্ভবত এটি উভয়ই একবার - তবে আমি জানি না এবং পছন্দ করতে হবে। যদি তা না হয় শুধুমাত্রb পশু খামার বিবৃতি, তারপর আমি বিশ্বাস করি একটি dতার জায়গায় এবং প্রয়োজনীয়তা দূর হবে ' -e 'বিরতি, কিন্তু আমি বরং একটি তিনবার hazarding সামনে নির্দিষ্ট হতে চাই POSIXified উত্তর। তুমি কি সাহায্য করতে পারো?

আমি সবকিছুর পরেও এটি ঝুঁকি নিয়েছিলাম, তবে কোনও দুর্দান্ত নিশ্চিততার সাথে নয় ...


এর সাথে b;n;:b, আপনি ";n;:b"historicalতিহাসিক এবং পসিক্স সেডগুলিতে ডাকা লেবেলে শাখা করছেন (এবং জিএনইউ সেড সেই সম্মতিতে নেই)।
স্টাফেন চেজেলাস

@ স্টাফেনচাজেলাস - আমি :অংশটি পেয়েছি - আপনি এই বাড়িটি কয়েক মাস আগে চালিত করেছিলেন। তবে দ্বিতীয় sedকমান্ডটি কেন একইভাবে POSIXified হয়েছিল তা আমি পুরোপুরি বুঝতে পারি না ।
মাইক্রজারভ

1
যাই হোক না কেন, এর জন্য পসিক্স স্পেসটি sedআমার কাছে খুব অস্পষ্ট। আমি অতীতে কয়েকবার স্পষ্টকরণের জন্য অনুরোধ করেছি, তবে ফলস্বরূপ এটি আপডেট হয়েছিল বলে আমি মনে করি না। উত্তম পরীক্ষাটি হেরলুম সরঞ্জামচেষ্টার সাথে চেষ্টা করা হয় (সোলারিস এক, মূল থেকে উদ্ভূত এবং যা পসিক্স স্পেক মূলত ভিত্তিক)।
স্টাফেন চেজেলাস

1
@ সাইন্ট্যাক্সেরর - আমি বিশ্বাস করি না যে এটি মোটেই ঘটেছে। আপনি যদি s///অনুমানটি পড়েন তবে আপনি দেখতে পাবেন যে একটি স্ট্রিংয়ের সাথে শৃঙ্খলা গ্রহণ করার জন্য ubstitutions নির্দিষ্ট করা হয়েছে ; । এটি কম্যান্ডের আশেপাশে অস্পষ্ট হয়ে যায় যা অবশ্যই একটি নতুন লাইনের সাথে সীমাবদ্ধ করা উচিত এবং কীভাবে -eসেই ক্ষেত্রে দাঁড়াতে পারে - কমপক্ষে এটি আমার পক্ষে হয়। ive এখনও কোনও sedএমন কিছুর হোঁচট খায় যা তাদের সুন্দরভাবে পরিবর্তিত হলেও ব্যাখ্যা করে না।
মাইকজার্ভেস

1
@ সাইন্ট্যাক্সেরর - আমার এটি পছন্দ হয়েছে তবে আপনার জানা উচিত যে ;নতুন লাইনের আগে আপনার দরকার নেই - একটি নিউলাইন ঠিক আছে। সত্য, আপনি এবং সম্পূর্ণরূপে ছাড়াই করতে পারেন -eএবং কেবল #!/bin/sedএকটি নিউলাইনে প্রতিটি কমান্ডের মতো একটি ফাইল লিখতে পারেন - বা যেগুলির পরিবর্তে ডিলিমেটেডের জন্য যেমন ডিলিমেটারগুলির প্রয়োজন হয় না ;। বেশী যে কি করতে - নতুন লাইন প্রয়োজন সাধারণত বেশী যে অবাধ ইনপুট নিতে হয় :ট্যাগ নাম এবং কমান্ড যে মত তাদের পড়ুন bবা tবা বন্ধ }ফাংশন, বা curlies rEAD এবং wআচার যা ফাইলের নাম args নিতে। এগুলি সবগুলি অনুসরণ করার দরকার \n
মাইকজার্ভ

উত্তর:


4

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

পাঠ্যের প্রাসঙ্গিক অংশগুলি সমস্ত শিরোনামের অধীনে পাওয়া যায় ...

  • কমান্ডগুলি সম্পাদনা করেsed :

    • যুক্তি পাঠ্যটিতে এক বা একাধিক লাইন থাকবে। \nপাঠ্যের প্রতিটি এম্বেড করা ইলাইনটি একটি \ব্যাকস্ল্যাশ এর আগে হবে । পাঠ্যের অন্যান্য ব্যাকস্ল্যাশগুলি অপসারণ করা হবে এবং নিম্নলিখিত বর্ণনাকে আক্ষরিক অর্থে বিবেচনা করা হবে।

    • rএবং wকমান্ড ক্রিয়া, এবং wপতাকা sকমান্ড একটি ঐচ্ছিক নেওয়া rfile (অথবা wfile এক বা একাধিক দ্বারা) প্যারামিটার হয়, চিঠি বা পতাকা ক্রিয়া কমান্ড থেকে আলাদা <blank>s; প্রয়োগগুলি এক্সটেনশন হিসাবে শূন্য পৃথকীকরণের অনুমতি দিতে পারে।

    • কমান্ড ছাড়া অন্য ক্রিয়া {, a, b, c, i, r, t, w, :, এবং #একটি দ্বারা অনুসরণ করা যেতে পারে ;সেমিকোলন, ঐচ্ছিক <blank>s, এবং অন্য কমান্ড ক্রিয়া। যাইহোক, যখন sকমান্ড ক্রিয়াটি wপতাকাটির সাথে ব্যবহৃত হয় , অন্য কমান্ডের সাথে এটি অনুসরণ করে অনির্ধারিত ফলাফল দেয়।

...ভিতরে...

  • বিকল্প: একাধিক -eএবং -fবিকল্প নির্দিষ্ট করা যেতে পারে। সমস্ত কমান্ডগুলি নির্ধারিত ক্রমে স্ক্রিপ্টে যুক্ত করা হবে, নির্বিশেষে তাদের উত্স।

    • -e স্ক্রিপ্ট - দ্বারা নির্দিষ্ট সম্পাদনা কমান্ড যোগ স্ক্রিপ্ট শেষে বিকল্প-যুক্তি স্ক্রিপ্ট সম্পাদনা কম্যান্ডের। স্ক্রিপ্ট বিকল্প-আর্গুমেন্ট হিসাবে একই বৈশিষ্ট্য থাকিবে স্ক্রিপ্ট প্রতীক, বর্ণিত OPERANDS অধ্যায়।

    • -f script_file - ফাইল সম্পাদনা কমান্ড যোগ script_file স্ক্রিপ্ট শেষে।

এবং সর্বশেষে ...

  • Operands:

    • স্ক্রিপ্ট - কমানোর সম্পাদনার স্ক্রিপ্ট হিসাবে ব্যবহৃত একটি স্ট্রিং used চূড়ান্ত অক্ষরটি একটি ই- লাইন না হওয়া ব্যতীত অ্যাপ্লিকেশন কোনও স্ক্রিপ্ট উপস্থাপন করবে না যা পাঠ্য ফাইলের সীমাবদ্ধতা লঙ্ঘন করে \n

সুতরাং, আপনি যখন এটি সম্পূর্ণরূপে গ্রহণ করবেন তখন এটি বোঝা যায় যে পূর্বনির্ধারিত ডিলিমিটার ( s d sub d repl d flagউদাহরণস্বরূপের বিপরীতে ) ব্যতীত যে কোনও কমান্ড \narচ্ছিকভাবে একটি স্বেচ্ছাসেবী প্যারামিটার দ্বারা অনুসরণ করা উচিত একটি অনির্বাচিত ewline এ সীমিত করা উচিত ।

এটা যে বিতর্কিত হয় ; হয় একটি পূর্বনির্ধারিত বিভেদক কিন্তু সেক্ষেত্রে ব্যবহার ;কোন জন্য [aic]পৃথক, যে জন্য ব্যবহৃত পার্সার থেকে, - কমান্ড অবশ্যম্ভাবী যে একটি আলাদা পার্সার যারা তিন কমান্ড জন্য বিশেষভাবে বাস্তবায়ন অন্তর্ভুক্ত করা [:brw]উদাহরণস্বরূপ,। অন্যথায় বাস্তবায়ন প্রয়োজন যে হবে ; এছাড়াও হতে ব্যাকস্ল্যাশ মধ্যে পলান টেক্সট প্যারামিটার এবং এটি শুধুমাত্র আরো অনেক কিছুতে সেখান থেকে জটিল বৃদ্ধি।

আমি যদি এমন কিছু লিখতাম sedযা আমি উপযুক্ত এবং দক্ষ উভয়ই হতে চেয়েছিলাম তবে আমি এ জাতীয় আলাদা পার্সার লিখব না, আমি প্রত্যাশা করি - তা ছাড়া [aic]যদি কোনও \nইমলাইন অবিলম্বে অনুসরণ না করা হয় তবে একটি বাক্য গঠন ত্রুটি ঘটানো উচিত। তবে এটি একটি সরল টোকেনাইজেশন সমস্যা - শেষ ডিলিমিটার ক্ষেত্রে সাধারণত সমস্যা বেশি হয়। আমি শুধু এটি লিখতে হবে:

sed -e w\ file\\ -e one -e '...;and more commands'

...এবং...

sed -e a\\ -e appended\\ -e text -e '...;and more commands'

... খুব অনুরূপ আচরণ করবে, এতে প্রথমটি একটি ফাইল তৈরি এবং লিখবে:

file
one

... এবং দ্বিতীয়টি আউটপুট যেমন বর্তমান লাইনে পাঠ্যের একটি ব্লক সংযোজন করবে ...

appended
text

... কারণ উভয়ই প্যারামিটারের জন্য একই পার্সিং কোডটি ভাগ করবে।

আর সংক্রান্ত { ... }এবং $!ইস্যু - ভাল, আমি পথ বন্ধ ছিল। একটি একক একটি ঠিকানা পূর্বে কমান্ড না একটি ফাংশন বরং এটা শুধু একটি কমান্ড সম্বোধন করা হয়েছে। মন্তব্য এবং লেবেল সংজ্ঞা ব্যতীত ফাংশন সংজ্ঞা সহ প্রায় সমস্ত কমান্ড স্বীকৃত বা ঠিকানার জন্য নির্দিষ্ট করা হয়েছে । এবং কোনও ঠিকানা লাইন নম্বর বা নিয়মিত এক্সপ্রেস হতে পারে এবং এটিকে অবহেলা করা যেতে পারে । সুতরাং সব ...{ }/one//one/,/two/#:!

$!d
/address/s/ub/stitution/
5!y/d/c/

... ;স্ট্যান্ডার্ড অনুযায়ী একাধিক কমান্ড অনুসরণ করা যেতে পারে , তবে যদি কোনও একক ঠিকানার জন্য আরও কমান্ডের প্রয়োজন হয় এবং প্রতিটি কমান্ড কার্যকর করার পরে সেই ঠিকানাটি পুনরায় মূল্যায়ন করা উচিত না, তবে একটি {ফাংশন }ব্যবহার করা উচিত:

/address/{ s//replace addressed pattern/
           s/do other conditional/substitutions/
           s/in the same context/without/
           s/reevaluating/address/
}

... যেখানে {সমাপ্তির মাধ্যমে একই লাইনে অনুসরণ করা যাবে না এবং একটি লাইন শুরু হওয়া ব্যতীত }একটি সমাপনি }ঘটতে পারে না। তবে যদি একটি \nঅন্তর্নিহিত কমান্ডটি অন্যথায় একটি ইলাইন অনুসরণ না করা উচিত , তবে এটি ফাংশনটির মধ্যেও দরকার নেই। সুতরাং উপরোক্ত সমস্ত s///ubstitutions - এবং এমনকি বন্ধ }বন্ধনী, বহির্গমন ;এবং পরবর্তী কমান্ড অনুসরণ করা যেতে পারে ।

আমি \newline সীমানা নিয়ে কথা বলতে থাকি তবে প্রশ্নটি -eএক্সপ্রেশন স্টেটমেন্ট সম্পর্কে , আমি জানি। তবে দুটি সত্যিই এক এবং একই এবং মূল সম্পর্কটি হ'ল স্ক্রিপ্টটি হ'ল আক্ষরিক কমান্ড-লাইন আর্গুমেন্ট বা -[ef]যে কোনও একটি ফাইল হতে পারে এবং উভয়ই পাঠ্য ফাইল হিসাবে ব্যাখ্যা করা হয় (যা শেষতে নির্দিষ্ট করা হয় \newline) তবে একটি ewline এ আসলেই শেষ হওয়ার দরকার \nনেই। এর মাধ্যমে আমি যুক্তিসঙ্গতভাবে (আশা করি) অনুমান করতে পারি যে একটি \0NULসীমিত যুক্তিটি একটি শেষ \nইওলাইনকে বোঝায় , এবং যেহেতু সমস্ত প্রার্থনা যুক্তি কমপক্ষে পাওয়া যায়) একটি \0NULডিলিমিটার হয়, তবে হয় সূক্ষ্মভাবে কাজ করা উচিত।

প্রকৃতপক্ষে, বাস্তবে, প্রতিটি ক্ষেত্রেই কিন্তু যেখানে মানক একটি \ব্যাকস্ল্যাশ পলাতক নিউলাইনটি নির্দিষ্ট করে সেখানে আবশ্যক, আমি বহনযোগ্যভাবে খুঁজে পেয়েছি ...

sed -e ... -e '...\' -e '...'

... ঠিক কাজ করার জন্য। এবং প্রতিটি ক্ষেত্রে - আবার, অনুশীলনে - যেখানে একটি নন- \nপলাতকৃত ewline প্রয়োজন হবে ...

sed -e '...' -e '...'

... আমার জন্যও কাজ করেছে। উপরে বর্ণিত একটি ব্যতিক্রম হ'ল ...

sed -e 's/.../...\' -e '.../'

... যা আমার কোনও পরীক্ষায় কোনও প্রয়োগের জন্য কাজ করে না। আমি মোটামুটি নিশ্চিত যে টেক্সট ফাইলের প্রয়োজনীয়তার পিছনে পড়ে এবং একটি ডিলিমিটার নিয়ে s/// আসে এবং তাই কোনও একক বিবৃতিতে \0NULসীমানা যুক্তি ছড়িয়ে দেওয়ার কোনও কারণ নেই ।

সুতরাং, উপসংহারে, এখানে বিভিন্ন ধরণের sedকমান্ড লিখতে পোর্টেবল উপায়ে একটি সংক্ষিপ্ত রান্ডাউন রয়েছে :

যে কোনও জন্য [aic]:

...commands;[aic]\
text embedded newline\
delimiting newline
...more;commands...

... অথবা ...

sed -e '...commands;[aic]\' -e 'text embedded newline\' -e 'delimiting newline' -e '.;.;.'

কোন জন্য [:rwtb]যেখানে প্যারামিটার হয় ঐচ্ছিক (সমস্ত কিন্তু :) কিন্তু delimiting \newline হয় না । দ্রষ্টব্য যে আমি কখনও কখনও একাধিক লাইন লেবেল প্যারামিটারগুলি ব্যবহার করার চেষ্টা করার কারণ পাই নি [:tb], তবে [rw] ফাইল প্যারামিটারে একাধিক লাইনে রিটিং w/ rইডিং সাধারণত প্রশ্ন ছাড়াই গ্রহণ করা হয় আমি এম্বেডড ইওলাইন যতক্ষণ পরীক্ষা করেছি ডাব্লু / একটি ব্যাকস্ল্যাশ পালানো হয় । তবুও, স্ট্যান্ডার্ডটি সরাসরি সেই লেবেলটি নির্দিষ্ট করে না এবং [rw] ফাইলের পরামিতিগুলি পাঠ্যে অভিন্নভাবে পার্স করা উচিতsed\n\প্যারামিটারগুলি এবং \nপ্রথম দুটি সম্পর্কিত ইওলাইনগুলির কোনও উল্লেখ না করে যতক্ষণ না সেগুলি সীমিত করে দেয়।

...commands;[:trwb] parameter
...more;commands...

... অথবা ...

sed -e '[:trwb] parameter' -e '...'

... যেখানে <space>উপরের জন্য isচ্ছিক [:tb]

এবং শেষে...

...;address[!]{ ...function;commands...
};...more;commands....

... অথবা ...

sed -e '...;address[!]{ ...function;commands...' -e '};...more;commands...'

... যেখানে উপরোক্ত কমান্ডের কোন (ব্যতীত :) এছাড়াও অন্তত একটি গ্রহণ ঠিকানা এবং যা হয় একটি হতে পারে /regexp /বা একটি লাইন নম্বর এবং সঙ্গে অস্বীকার করা যেতে পারে !, কিন্তু যদি একটির বেশি কমান্ডের একটি একক নিরীক্ষার জন্য প্রয়োজনীয় ঠিকানা তারপর {ফাংশন প্রসঙ্গে }ডিলিমেটিং বন্ধনীগুলি অবশ্যই ব্যবহার করা উচিত। একটি ফাংশন এমনকি একাধিক \newline বিস্মৃত কমান্ড থাকতে পারে , তবে প্রতিটি অবশ্যই বন্ধনী মধ্যে সীমিত করা উচিত অন্যথায় এটি।

এবং এইভাবে পোর্টেবল sedস্ক্রিপ্টগুলি লিখতে হয় ।


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