কোনও পেছনের শ্বেতক্ষেত্রের সাথে / ছাড়া কোনও শব্দের সাথে কী মিল রয়েছে?


12

আমি শেল-স্ক্রিপ্টিং শিখছি এবং এর জন্য আমি হ্যাকারর্যাঙ্ক ব্যবহার করছি। sedএকই সাইটে সম্পর্কিত একটি প্রশ্ন রয়েছে : 'সেড' কমান্ড # 1 :

প্রদত্ত ইনপুট ফাইলের প্রতিটি লাইনের জন্য, 'এই' দিয়ে শব্দের প্রথম উপস্থিতিটি রূপান্তর করুন। অনুসন্ধান এবং রূপান্তর কঠোরভাবে সংবেদনশীল হওয়া উচিত।

সবার আগে আমি চেষ্টা করেছি,

sed 's/the/this/'

তবে সেই নমুনা পরীক্ষার ক্ষেত্রে ব্যর্থ হয়েছিল। তারপরে চেষ্টা করেছি

sed 's/the /this /'

এবং এটা কাজ করে. সুতরাং, প্রশ্ন উঠছে যে সাদা স্থানগুলি কী পার্থক্য তৈরি করেছিল? আমি কি এখানে কিছু মিস করছি?


আমি ধরে নিলাম প্রথম সংস্করণটি "কাজ করেছে", তবে আপনি যেমন প্রত্যাশা করেছিলেন তেমনটি হয় নি। অক্ষরের অনুক্রম "দ" এর প্রথম উপস্থিতিটি প্রতিস্থাপন করা উচিত ছিল, তবে আপনি সম্ভবত "the" শব্দের প্রথম উপস্থিতিটি দেখেছিলেন।
দুবু

ঠিক আছে, থিওরিতে, হ্যাঁ, অনুশীলনে, না।
রোল্ফ

উত্তর:


7

পার্থক্যটি হ'ল theইনপুট পাঠ্যের পরে কোনও স্থান আছে কিনা ।
এই ক্ষেত্রে:

স্থান ছাড়া বাক্য সহ , কোনও প্রতিস্থাপন:

$ echo 'theman' | sed 's/the /this /'
theman

একটি স্থানের সাথে একটি বাক্য দিয়ে , প্রত্যাশার মতো কাজ করে:

$ echo 'the man' | sed 's/the /this /'
this man

অন্য একটি সাদা স্থানের অক্ষরের সাথে একটি বাক্য সহ , কোনও প্রতিস্থাপন ঘটবে না:

$ echo -e 'the\tman' | sed 's/the /this /'
the     man

আমি সেটা মিস করছিলাম. "স্ট্রিং" হিসাবে আমাকে নিতে হয়েছিল। সাবস্ট্রিং নয়।
জেএইচএ

1
@ জেএএচএ: এটি একটি লাইনের শেষেও গুরুত্বপূর্ণ। উদাহরণস্বরূপ, "দ্য" শব্দটি লাইন মোড়কযুক্ত কোনও ফাইলের অংশ হিসাবে একটি লাইনের শেষে উপস্থিত হতে পারে তবে তবুও একটি অনুচ্ছেদের মাঝখানে থাকতে পারে এবং এইভাবে একটি ইংরেজি বাক্যে সাধারণ শব্দ হতে পারে। the( |$)কাজের আরও কাছাকাছি হতে পারে, যদি সেই প্রসারিত রেজেক্স কাজ করে। যাইহোক, আইডিকে আপনার "স্ট্রিং হিসাবে" বনাম স্ট্রিং বলতে কী বোঝায়। উভয় ক্ষেত্রেই এটি পুরো লাইনের একটি স্ট্রিং এবং আপনার পরীক্ষাগুলি "the "ব্যর্থ হয় এমন ক্ষেত্রেগুলি সনাক্ত করতে অপর্যাপ্ত । কুসালনাদার উত্তর উল্লেখযোগ্যভাবে ভাল, আমি এটি গ্রহণ করার পরামর্শ দিই।
পিটার কর্ডেস

20

শব্দ মেলানো এটি একটি সস্তা এবং ত্রুটি-প্রবণ উপায় ।

নোট করুন যে theকোনও জায়গার সাথে শব্দের সাথে এটি মেলে না thereby, সুতরাং theশব্দের শুরুতে সেই স্ট্রিংটির সাথে ম্যাচ করা এড়িয়ে যাওয়ার পরে কোনও জায়গার সাথে মিল matching যাইহোক, এটা এখনও নেই মেলে bathe(যদি একটি স্থান থাকে), এবং এটি নেই না মেলে theএকটি লাইন শেষে।

শব্দের theযথাযথভাবে (বা অন্য কোনও শব্দ) মেলাতে , আপনাকে শব্দের চারপাশে ফাঁকা স্থান ব্যবহার করা উচিত নয়, কারণ এটি আপনাকে লাইনের শুরু বা শেষের দিকে এটি মিলে যাওয়া থেকে বিরত রাখতে পারে বা যদি এটি অন্য কোনও শব্দহীন চরিত্রের সাথে ফ্ল্যাঙ্ক করে থাকে, যেমন যেকোন বিরামচিহ্ন বা ট্যাব অক্ষর উদাহরণস্বরূপ।

পরিবর্তে, একটি শূন্য প্রস্থের শব্দ সীমানা প্যাটার্ন ব্যবহার করুন:

sed 's/\<the\>/this/'

\<এবং \>অর্থাত একটি মধ্যে স্থান আগে ও শব্দ পরে সীমানা সাথে মিলে যায়, শব্দ চরিত্র এবং একটি অ শব্দ চরিত্র । একটি শব্দের অক্ষর হ'ল সাধারণত যে কোনও অক্ষর মিলে যায় [[:alnum:]_](বা [A-Za-z0-9_]পসিক্স লোকালে)।

গনুহ সঙ্গে sed, এছাড়াও আপনি ব্যবহার করতে পারে \bস্থানে \<এবং \>:

sed 's/\bthe\b/this/'

7

সেড নিয়মিত প্রকাশের সাথে কাজ করে। sed 's/the /this /'আপনাকে ব্যবহার theকরে ম্যাচিং প্যাটার্নের কিছু অংশের পরে স্থান তৈরি করুন ।

ব্যবহার sed 's/the/this/'তোমরা সবাই ঘটনার প্রতিস্থাপন theসঙ্গে thisএকটি স্থান পরে বিদ্যমান কোন ব্যাপার the

হ্যাকারর্যাঙ্ক অনুশীলনে ফলাফল একই রকম হয় কারণ এর সাথে প্রতিস্থাপন করা যৌক্তিক ... আপনি কেবলমাত্র একটি প্রো-বিশেষ্যটি প্রতিস্থাপন করেন যা ডিফল্টরূপে স্থান (ব্যাকরণের নিয়ম) দ্বারা অনুসরণ করা হয়।

আপনি যদি theশব্দটির মূলধনটি উদাহরণের জন্য চেষ্টা করেন তবে আপনি পার্থক্যটি দেখতে পাবেন the theater:

echo 'the theater' |sed 's/the /THE /g'
THE theater                              
#theater is ignored since the is not followed by space

echo 'the theater' |sed 's/the/THE/g'
THE THEater
#both the are capitalized.

উত্তরের জন্য ধন্যবাদ. প্রশংসা করেছেন :)
জেএইচএ

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