\\ বনাম ব্যবহার করে using ব্যবহার করে নিয়মিত প্রকাশ


10

কেন

grep e\\.g\\. <<< "this is an e.g. wow"

এবং

grep e\.g\. <<< "this is an e.g. wow"

একই জিনিস?

আমি যদি তৃতীয় স্ল্যাশ যোগ করি তবে এরও একই ফলাফল রয়েছে। তবে একবার আমি চতুর্থ স্ল্যাশ যুক্ত করলে এটি আর কাজ করে না। এটি একটি ক্লাসের জন্য একটি পুরানো পরীক্ষা থেকে একটি প্রশ্ন সঙ্গে করতে হবে। এটি জিজ্ঞাসা করেছিল যে দুটি ব্যাকস্ল্যাশওয়ালা একটি "উদাহরণস্বরূপ" দিয়ে লাইন আউটপুট দেওয়ার জন্য কাজ করবে কিনা আমি মূলত ভেবেছিলাম এটি কাজ করবে না, তবে আমি নিশ্চিত করার চেষ্টা করেছি এবং এটি হয়েছে। এর ব্যাখ্যা কী?


আমি ভাবছিলাম বাশ গ্রাপ নেবে \\\.এবং দেবে \.তবে তা হয় না। ভাল প্রশ্ন

উত্তর:


9

প্রথম, নোট করুন যে একক স্ল্যাশ খুব বেশি মেলে:

$ echo $'eegg \n e.g.' | grep e\.g\.
eegg
 e.g.

যতদূর বাশ সম্পর্কিত, একটি পালানো সময়কাল একই সময়ের মতো। বাশ পিরিয়ডে গ্রেপ হয়ে যায় । গ্রেপের জন্য, একটি সময়ের কোনও কিছুর সাথে মিল রয়েছে।

এখন, বিবেচনা করুন:

$ echo $'eegg \n e.g.' | grep e\\.g\\.
 e.g.
$ echo $'eegg \n e.g.' | grep e\\\.g\\\.
 e.g.
$ echo $'eegg \n e.g.' | grep e\\\\.g\\\\.
$

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

ট্রিপল স্ল্যাশ সহ, ব্যাশ প্রথম দুটি কমিয়ে একক স্ল্যাশ করে। এটি তখন দেখে \.। যেহেতু একটি পালানো সময়ের বাশের কোনও বিশেষ অর্থ নেই, তাই এটি সরল সময়কালে হ্রাস পেয়েছে। ফলাফলটি হ'ল গ্রেপ দেখায়, যেমনটি আমরা চাই, পিরিয়ডের আগে একটি স্ল্যাশ।

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

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

$ echo 'eegg
e.g.
e\.g\.' |  grep e\\\\.g\\\\.
e\.g\.

বাশের আচরণের সংক্ষিপ্তসার

বাশের জন্য, নিয়মগুলি হ'ল

  • দুটি স্ল্যাশ একক স্ল্যাশে হ্রাস পেয়েছে।

  • একটি পিরিয়ডের মতো একটি সাধারণ চরিত্রের সামনে একটি স্ল্যাশ হ'ল সাধারণ অক্ষর (পিরিয়ড)।

এভাবে:

$ echo \. \\. \\\. \\\\.
. \. \. \\.

এই সমস্ত বিভ্রান্তি এড়ানোর একটি সহজ উপায় রয়েছে: বাশ কমান্ড লাইনে নিয়মিত প্রকাশগুলি একক-উদ্ধৃতিতে রাখা উচিত। একক উদ্ধৃতিগুলির ভিতরে, বাশ সব ছেড়ে দেয়।

$ echo '\. \\. \\\. \\\\.'  # Note single-quotes
\. \\. \\\. \\\\.

প্রশ্ন: ব্যাকসটিকে ব্যাকস্ল্যাশ হিসাবে দেখতে এটি দুটি ব্যাকস্ল্যাশ লাগে (একটিতে পালানোর ক্রম, অন্যটি আক্ষরিক ব্যাকস্ল্যাশ)। সুতরাং, যখন 3 টি রয়েছে তখন বাশ তৃতীয় স্ট্রাগলারকেও একটি পালানোর ক্রম হিসাবে ধরে রাখে? যেহেতু এটি কিছুই থেকে বাঁচছে, তা কি তখন তা ফেলে দেওয়া হয়?
ফ্রানজ কাফকা

@ ড্যানিয়েলআমায়া তৃতীয়টিকে অনুসরণ করা চরিত্রের জন্য পালানো হিসাবে ধরা হয় আমাদের ক্ষেত্রে, সেই চরিত্রটি সময়কাল এবং, বাশের জন্য (গ্রেপের বিপরীতে), একটি পালানো সময়কাল কেবল একটি সহজ সময়। এরপরে বাশ সমাকালীন সময়কে গ্রেপ-এ চলে যায়।
1024

@ ড্যানিয়েলআমায়া একটি echoবিবৃতিটির আপডেট হওয়া উত্তর দেখুন যা এই ক্ষেত্রে বাশ কী করে তা চিত্রিত করে।
1024

2
@ ড্যানিয়েলআমায়া উভয় ক্ষেত্রেই ব্যাশ প্রথম দুটি স্ল্যাশ একক স্ল্যাশে হ্রাস করে। যা আছে তা \.বা .। বাশের জন্য, উভয়ই একই: তারা একটি সাধারণ সময়ের সমতুল্য। সুতরাং, সামগ্রিকভাবে, ব্যাশ গ্রেপকে যা সরবরাহ করে তা উভয়ের জন্য একই: একক স্ল্যাশ পরে পিরিয়ড।
1024

1
কেবলমাত্র একটি সামান্য সংযোজন - echoএই প্রোগ্রামটির অনেকগুলি প্রয়োগের কারণে রিজেক্স্প পরীক্ষা করার পক্ষে খুব নির্ভরযোগ্য উপায় নয়। উদাহরণস্বরূপ আমার zsh এর অধীনে (অন্তর্নির্মিত প্রতিধ্বনি) echo \. \\. \\\. \\\\. \\\\\.দেয় . \. \. \. \., তবে /bin/echo \. \\. \\\. \\\\. \\\\\.ফিরে আসে . \. \. \\. \\.। এর মতো printf "%s" ...কিছু সম্ভবত সবচেয়ে ভাল উপায়।
jimmij

4

আউটপুট কেবল আপনার স্ট্রিংয়ের জন্য একই তবে সাধারণভাবে নিয়মিত প্রকাশগুলি বিভিন্ন কাজ করে। আসুন দ্বিতীয় প্যাটার্ন e,g,(কোমাস সহ), তৃতীয় e\.g\.(বিন্দু), চতুর্থ e\,g\,(কোমা) যোগ করে এবং -oকেবল মিলিত অংশগুলি মুদ্রণের জন্য গ্রেপ বিকল্পটি যুক্ত করে আপনার উদাহরণটি কিছুটা পরিবর্তন করুন ।

  • নিম্নলিখিত যদি .কোনো CHAR (নোটিশ মেলে ''প্রায় e.g., আমি পরে আসবে)

    $ grep -o 'e.g.' <<< grep -o 'e.g.' <<< 'this is an e.g. e,g, e\.g\. e\,g\,'
    e.g.
    e,g,
  • এরপরে আমরা .ব্যাকস্ল্যাশ নিয়ে পালাতে পারি \, সুতরাং কেবল আক্ষরিক .মিল থাকবে:

    $ grep -o 'e\.g\.' <<< 'this is an e.g. e,g, e\.g\. e\,g\,'
    e.g.
  • তবে আমরা \অন্যের সাথে পালাতে পারি \, যাতে আক্ষরিক \মিল হয় .(যার পরে কোনও চর):

    $ grep -o 'e\\.g\\.' <<< 'this is an e.g. e,g, e\.g\. e\,g\,'
    e\.g\.
    e\,g\,
  • তবে আমরা যদি কেবলমাত্র মিলইতে চাই \.না \,তবে \ডটটির বিশেষ অর্থ থেকে বাঁচার জন্য আরও একটি প্রয়োজন:

    $ grep -o 'e\\\.g\\\.' <<< 'this is an e.g. e,g, e\.g\. e\,g\,'
    e\.g\.

এখন, আপনি ''গ্রেপ যুক্তির চারপাশে ব্যবহার না করায় শেলের ব্যাখ্যা থেকে ব্যাকস্ল্যাশগুলি এড়াতে আপনাকে আরও একটি ব্যাকস্ল্যাশ যুক্ত করতে হবে, সুতরাং:

grep 'e\.g\.'     => grep e\\.g\\.
grep 'e\\.g\\.'   => grep e\\\\.g\\\\.  (each backslash has to be quoted separately)
grep 'e\\\.g\\\.' => grep e\\\\\\.g\\\\\\. (3 x 2 = 6 backslashes in total)

3

আপনি যখন grep e\.g\.এটি করেন, শেলটি ব্যাকস্ল্যাশ গ্রাস করে, সুতরাং আপনি এটি করছেন grep e.g.যা মিলছে। আপনি যখন grep e\\.g\\.এটি করেন, শেলটি আবার একটি স্ল্যাশ গ্রাস করে এবং এখন আপনি একটি করছেন grep e\.\g.যা আবার মিলছে। এখন, শেলের একটি ব্যাকস্ল্যাশ মত দেখাচ্ছে \\। সুতরাং, যখন আপনার \\প্রথমটি হ'ল পালাবার ক্রম, দ্বিতীয়টি আক্ষরিক ব্যাকস্ল্যাশ। আপনি যখন grep e\\\.g\\\.এটি করেন, এটি এখনও শেষ হয়ে যায় grep e\.\g., কারণ এটিকে আক্ষরিক করে তোলার \আগে কোনও পলায়নের ক্রম নেই ( ) । মনে রাখবেন a একটি ব্যাকস্ল্যাশ, এভাবে সত্তা শেষ হয় , যা সম্ভবত মেলে না।\\grep e\\\\.\\\\ggrep e\\.g\\.

আপনি কী করছেন শেলটি কীভাবে দেখছে তা দেখতে, প্রতিধ্বনি (যেমন, echo grep e\\.g\\. <<< "this is an e.g. wow"বনাম echo grep e\\\\.g\\\\. <<< "this is an e.g. wow") ব্যবহার করুন


0

দুটি কমান্ড কেবল আপনার ইনপুটটির জন্য একই আউটপুট উত্পাদন করে তবে অন্যথায় সেগুলি পৃথক। কী চলছে তা বোঝার জন্য আমাদের জানতে হবে যে প্যারামিটারটি প্রথমে bashএবং তারপরে কীভাবে ব্যাখ্যা করা হয় grep

বাশে পালাচ্ছে

\এটি একটি বিশেষ চরিত্র যা \নিজের সহ নিম্নলিখিত বর্ণের বিশেষ অর্থ বাতিল করে। নিম্নলিখিত বর্ণটির যদি কোনও বিশেষ অর্থ না থাকে তবে তা পরিবর্তন ছাড়াই পাস করা হয়। কমান্ড এবং ফলাফল সহ উদাহরণ:

  • echo \a: a- সাধারণ চরিত্র পালিয়ে যায় চরিত্রটি দেয়
  • echo \\: \- বিশেষ চরিত্র পালিয়ে যায় চরিত্রটি দেয়
  • echo \\\a: \a- সমন্বয় বিশেষ, সাধারণ
  • echo \\\\: \\- সমন্বয় বিশেষ, বিশেষ

echoফলাফল bashব্যাখ্যা করার পরে ফলাফলটি স্ট্রিংটি মুদ্রণ করবে। আরও তথ্য: বাশ ডকুমেন্টেশন , ব্যাশ হ্যাকার উইকি , পসেক্স স্পেসিফিকেশন

.এর কোনও বিশেষ অর্থ নেই bash। এটি শেলের জন্য একটি সাধারণ চরিত্র। নীচে আপনার উদাহরণগুলির সাথে সম্পর্কিত অনুক্রমগুলি রয়েছে:

  • echo .: .
  • echo \.: .
  • echo \\.: \.
  • echo \\\.: \.
  • echo \\\\.: \\.

ব্যাশে আক্ষরিক স্ট্রিংয়ের সহজ সমাধান

আক্ষরিক অর্থে প্যারামিটারগুলি পাস করার জন্য bashআপনি একক উদ্ধৃতি 'পলায়ন ব্যবহার করতে পারেন । একক উদ্ধৃতিগুলির মধ্যে আপনাকে অক্ষরের বিশেষ অর্থ সম্পর্কে চিন্তা করতে হবে না কারণ একক উদ্ধৃতি হল একমাত্র অক্ষর যেখানে একটি বিশেষ অর্থ রয়েছে। আপনি স্ট্রিংয়ের প্রথম অংশটি আবদ্ধ করার পরে একটি একক উদ্ধৃতি সন্নিবেশ করতে পারেন। উদাহরণ
echo 'part1'\''part2': part1'part2

গ্রেপ ইন রেজেজ

\একইরকম অর্থ সহ একটি পালানোর চরিত্র bash.একটি বিশেষ চরিত্র যা কোনও চরিত্রের একক উপস্থিতি উপস্থাপন করে । দেখুন: পসিক্স রেজেেক্স , জিএনইউ গ্রেপ রেজেক্স । রেজেক্স এক্সপ্রেশনগুলির উদাহরণ:

  • .- সাথে মেলে মত কোন চরিত্র aবা.
  • \.- শুধুমাত্র .আক্ষরিক মিল

আপনার উদাহরণ

নীচের প্রতিটি উদাহরণের দ্বিতীয় লাইনে আপনি একক উদ্ধৃতিগুলির সমতুল্য দেখতে পাবেন 'যা আক্ষরিক স্ট্রিংটি দ্বারা পাস করা bashহয়েছে grep। তারপরে grepপারফরম্যান্সের পরে উদাহরণগুলিতে একমাত্র সম্ভাব্য বিশেষ চরিত্রটি পালনের পরে .কোনও চরিত্রের সাথে মেলে। তৃতীয় লাইনে একটি বিবরণ রয়েছে যা অভিব্যক্তিটির সাথে মেলে।

  • grep e.g. <<< "this is an e.g. wow"
    grep 'e.g.' <<< "this is an e.g. wow"
    eকোন চরিত্র gকোন চরিত্র - ম্যাচ e.g.এবং সম্ভবত অন্যান্য স্ট্রিং মতeagb
  • grep e\.g\. <<< "this is an e.g. wow"
    grep 'e.g.' <<< "this is an e.g. wow"
    eকোন চরিত্র gকোন চরিত্র - ম্যাচ e.g.এবং সম্ভবত অন্যান্য স্ট্রিং মতexgy
  • grep e\\.g\\. <<< "this is an e.g. wow"
    grep 'e\.g\.' <<< "this is an e.g. wow"
    e.g.আক্ষরিক - শুধুমাত্র মেলেe.g.
  • grep e\\\.g\\\. <<< "this is an e.g. wow"
    grep 'e\.g\.' <<< "this is an e.g. wow"
    e.g.আক্ষরিক - শুধুমাত্র মেলেe.g.
  • grep e\\\\.g\\\\. <<< "this is an e.g. wow"
    grep 'e\\.g\\.' <<< "this is an e.g. wow"
    e\যে কোনও চরিত্রের g\কোনও চরিত্র - মিলছে নাe.g.
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.