কমান্ড-লাইনে সম্প্রতি কিছু রেইগেক্স নিয়ে আমার সমস্যা হয়েছিল এবং আমি খুঁজে পেয়েছি যে ব্যাকস্ল্যাশ মিলানোর জন্য বিভিন্ন সংখ্যক অক্ষর ব্যবহার করা যেতে পারে। এই সংখ্যাটি রেজেক্সের জন্য ব্যবহৃত উদ্ধৃতিগুলির উপর নির্ভর করে (কোনওটিই নয়, একক উদ্ধৃতি, ডাবল উদ্ধৃতি)। আমার অর্থের জন্য নিম্নলিখিত বাশ সেশনটি দেখুন:
echo "#ab\\cd" > file
grep -E ab\cd file
grep -E ab\\cd file
grep -E ab\\\cd file
grep -E ab\\\\cd file
#ab\cd
grep -E ab\\\\\cd file
#ab\cd
grep -E ab\\\\\\cd file
#ab\cd
grep -E ab\\\\\\\cd file
#ab\cd
grep -E ab\\\\\\\\cd file
grep -E "ab\cd" file
grep -E "ab\\cd" file
grep -E "ab\\\cd" file
#ab\cd
grep -E "ab\\\\cd" file
#ab\cd
grep -E "ab\\\\\cd" file
#ab\cd
grep -E "ab\\\\\\cd" file
#ab\cd
grep -E "ab\\\\\\\cd" file
grep -E 'ab\cd' file
grep -E 'ab\\cd' file
#ab\cd
grep -E 'ab\\\cd' file
#ab\cd
grep -E 'ab\\\\cd' file
এই যে মানে:
- কোনও উদ্ধৃতি ছাড়াই, আমি 4-7 আসল ব্যাকস্ল্যাশ সহ একটি ব্যাকস্ল্যাশ মেলাতে পারি
- ডাবল উদ্ধৃতি সহ, আমি 3-6 প্রকৃত ব্যাকস্ল্যাশগুলির সাথে একটি ব্যাকস্ল্যাশ মেলাতে পারি
- একক উদ্ধৃতি সহ, আমি 2-3 টি আসল ব্যাকস্ল্যাশ সহ একটি ব্যাকস্ল্যাশ মেলাতে পারি
আমি বুঝতে পারি যে একটি অতিরিক্ত ব্যাকস্ল্যাশ শেল দ্বারা উপেক্ষা করা হবে (ব্যাশ ম্যান পৃষ্ঠা থেকে):
"একটি অ-উদ্ধৃত ব্যাকস্ল্যাশ (\) হ'ল পালাবার চরিত্র It এটি পরবর্তী অক্ষরের আক্ষরিক মান সংরক্ষণ করে যা অনুসরণ করে"
এটি একক-উদ্ধৃত উদাহরণগুলিতে প্রযোজ্য নয়, কারণ একক উদ্ধৃতিতে কোনও পলায়ন করা হয় না।
এবং আরও একটি অতিরিক্ত ব্যাকস্ল্যাশ গ্রেপ কমান্ড দ্বারা উপেক্ষা করা হয় ("\ সি" কেবল "সি" পালিয়ে গেছে, তবে এটি "সি" এর মতোই, কারণ "গ" এর একটি রেজেক্সের বিশেষ অর্থ নেই)।
এটি একক উদ্ধৃতি দিয়ে উদাহরণের আচরণ ব্যাখ্যা করে, তবে আমি অন্য দুটি উদাহরণ সত্যই বুঝতে পারি না, বিশেষত কেন নন-কউটেড একটি ডাবল-কোটেড স্ট্রিংয়ের মধ্যে পার্থক্য রয়েছে।
আবার, বাশ ম্যান পৃষ্ঠা থেকে একটি উদ্ধৃতি:
"ডাবল উক্তিগুলিতে অক্ষরগুলি সংযুক্ত করা $,`, \, এবং, যখন ইতিহাসের প্রসারণ সক্ষম করা হয়, ব্যতীত উদ্ধৃতিগুলির মধ্যে সমস্ত অক্ষরের আক্ষরিক মান সংরক্ষণ করে! "
আমি জিএনইউ অ্যাজকে (যেমন awk /ab\cd/{print} file
) একই ফলাফল দিয়ে একই চেষ্টা করেছি।
পার্ল, তবে, বিভিন্ন ফলাফল দেখায় (উদাহরণস্বরূপ perl -ne
"/ab\\cd/"\&\&print file
):
- কোনও উদ্ধৃতি ছাড়াই, আমি 4-5 আসল ব্যাকস্ল্যাশ সহ একটি ব্যাকস্ল্যাশ মেলাতে পারি
- ডাবল উদ্ধৃতি সহ, আমি 3-4 আসল ব্যাকস্ল্যাশ সহ একটি ব্যাকস্ল্যাশ মেলাতে পারি
- একক উদ্ধৃতি সহ, আমি 2 টি আসল ব্যাকস্ল্যাশ সহ একটি ব্যাকস্ল্যাশ মেলাতে পারি
গ্রেপ এবং অ্যাজকের জন্য কমান্ড-লাইনে অ-উদ্ধৃত এবং ডাবল-কোয়েটেড রেজেক্স স্ট্রিংগুলির মধ্যে যে পার্থক্যটি কেউ ব্যাখ্যা করতে পারেন? পার্লের আচরণের ব্যাখ্যায় আমি তেমন আগ্রহী নই, যেহেতু আমি সাধারণত পার্ল ওয়ান-লাইনার ব্যবহার করি না।
printf "\ntest"
"পরীক্ষার" আগে একটি নতুন লাইন প্রবেশ করানো হবে, যদিও শেলের দ্বারা এটি"\n"
অনুবাদ করা উচিত ছিল"n"
যেমন এটি দ্বিগুণ উদ্ধৃতি হিসাবে রয়েছে ... (সুতরাং প্রত্যাশিত ফলাফলটি হওয়া উচিত, "test নিস্ট", "নেস্ট" We আমাদের লেখার অভ্যাস করা উচিত:printf "\\ntest"
বাprintf '\ntest'
, তবে কোনওরকমভাবে আমি এর পরিবর্তে অদ্ভুততার উপরে অনেক স্ক্রিপ্ট নির্ভর করে দেখছি