কেন [এজে] নক্ষত্রের সাথে মিল রয়েছে?


13

আমার বর্তমান পথে 3 টি ডিরেক্টরি রয়েছে।

$ls
a_0db_data  a_clean_0db_data  a_clean_data
$ls a_*_data
a_0db_data:

a_clean_0db_data:

a_clean_data:

$ls a_[a-z]*_data
a_clean_0db_data:

a_clean_data:

আমি শেষের ls কমান্ডটি কেবলমাত্র মেলে বলে আশা করেছি a_clean_data। এটিও রয়েছে এমনটির সাথে মিলে গেল কেন 0?

bash --version
GNU bash, version 4.2.24(1)-release (i686-pc-linux-gnu)

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

4
সুতরাং a_*_dataম্যাচ করা - এই ফাইলগুলির মধ্যে কোনওটি আপনাকে অবাক করে না?
চথুলহু

@ চতুলহু তুমি আমাকে পেয়েছ!
ব্যবহারকারী 13107

উত্তর:


29

[a-z]অংশ কি সংখ্যার সাথে মেলে না; এটা *। আপনি শেল গ্লোববিং এবং নিয়মিত এক্সপ্রেশন গুলিয়ে ফেলতে পারেন ।

সরঞ্জামের মত grep(regexes বিভিন্ন স্বাদে গ্রহণ মৌলিক ডিফল্টরূপে, -Eবাড়ানো জন্য, -Pজন্য পার্ল Regex )

উদাহরণস্বরূপ ( -vম্যাচটি উল্টে দেয়)

$ ls a_[a-z]*_data | grep -v "[0-9]"
a_clean_data

আপনি যদি ব্যাশ রেজেক্স ব্যবহার করতে চান তবে ভেরিয়েবলটি $refপূর্ণসংখ্যা হয় কিনা তা পরীক্ষা করার জন্য এখানে একটি উদাহরণ রয়েছে :

re='^[0-9]+$'
if ! [[ $ref =~ $re ]] ; then
  echo "error"
fi

তখন কীভাবে ব্যাশ রেজেক্স ব্যবহার করবেন? ( tldp.org/LDP/Bash-Beginners- Guide
html/


21

তাহলে সমস্যাটি: a_[a-z]*_dataমিলছে কেন a_clean_0db_data?

এটি চার ভাগে বিভক্ত করা যেতে পারে :

  • a_শুরুর সাথে মেলে a_clean_0db_data, মিলতে রেখে leavingclean_0db_data

  • [a-z]সীমাবদ্ধতার a-z(যেমন c) পরিসরের যে কোনও অক্ষরের lean_0db_dataসাথে মিল রয়েছে to

  • * যে কোনও সংখ্যক অক্ষরের সাথে মেলে lean_0db

  • _data পিছনে মেলে _data

নিয়মিত প্রকাশে, এর [a-z]*অর্থ হ'ল a..z এর পরিসরে (শূন্য সহ) অনেকগুলি অক্ষর , তবে আপনি নিয়মিত প্রকাশের সাথে নয়, শেল গ্লোব্বিংয়ের সাথে ডিল করছেন।

আপনি যদি নিয়মিত ভাব প্রকাশ করতে চান তবে কয়েকটি findবাস্তবায়নের জন্য এর একটি -regexপূর্বাভাস রয়েছে:

find . -maxdepth 1 -regex "^.*/a_[a-z]*_data$"

-maxdepthশুধু এখানেই ফোল্ডারের তোমাদের মধ্যে আছি। হয় খোঁজ-ফলাফল সীমিত হয় রেগুলার এক্সপ্রেশন সাথে মিলে যায় সমগ্র ফাইলের নাম তাই আমি একটি যোগ করেছেন, ^.*/পথ-অংশ মেলে


11

*শেল নিদর্শনগুলিতে 0 বা আরও বেশি অক্ষরের সাথে মেলে। এটি *নিয়মিত এক্সপ্রেশন অপারেটরের সাথে বিভ্রান্ত হওয়ার দরকার নেই যার অর্থ পূর্ববর্তী পরমাণুর 0 বা আরও বেশি

*বেসিক শেল প্যাটার্নগুলিতে রিজেক্সপের সমতুল্য নেই । তবে এর জন্য বিভিন্ন শেলের এক্সটেনশন রয়েছে।

  • kshআছে *(something):

    ls a_*([a-z])_data
  • আপনার bashসাথে shopt -s extglobবা এর zshসাথে একই থাকতে পারে setopt kshglob:

    shopt -s extglob
    ls a_*([a-z])_data
    
  • ইন zshসঙ্গে extendedglobসক্রিয় থাকে, #regexp সমতূল্য *:

    setopt extendedglob
    ls a_[a-z]#_data
    
  • সাম্প্রতিক সংস্করণগুলিতে ksh93আপনি গ্লোবগুলিতে নিয়মিত প্রকাশও ব্যবহার করতে পারেন। এখানে বর্ধিত নিয়মিত প্রকাশের সাথে:

    ls ~(E:a_[a-z]*_data)

নোট করুন যে [a-z]বর্তমান লোকেলের উপর নির্ভর করে বিভিন্ন জিনিসের সাথে মেলে। এটি স্থানীয়ভাবে কেবল 26 aথেকে zল্যাটিন অ-উচ্চারণযুক্ত অক্ষরের সাথে মেলে C। অন্যান্য লোকালগুলিতে এটি সাধারণত আরও বেশি মেলে এবং সর্বদা তা বোঝায় না। আপনার লোকালে কোনও চিঠি মেলে, আপনি পছন্দ করতে পারেন [[:alpha:]]


আপনি কী [a-z]আরও 26 টি অক্ষরের সাথে সি লোকেলের সাথে মিলছে তার একটি উদাহরণ দিতে পারেন ? আমি যখন এটিকে সর্বশেষে দেখেছিলাম তখন যা মনে পড়ে, ইউনিক্স ভেরিয়েন্টগুলিতে ব্যবহারিকভাবে ব্যবহৃত সমস্ত এনকোডিংগুলিতে একটি বেস হিসাবে ISO-646 ছিল (তারপরে উপরের 128 কোডগুলি যেখানে আলাদাভাবে ব্যবহৃত হয়েছিল, সরাসরি আইএসও -8859-এক্স এর মতো এনকোডিংগুলিতে অক্ষরগুলির জন্য) ইউটিএফ -8 বা ইইউসি পরিবারের মতো এনকোডিংগুলি। এমনকি এআইএক্সেরও ইবিসিডিকের লোকেলগুলি ছিল না (কমপক্ষে আমার কাছে উপলভ্য হিসাবে)। আমি পসিক্স / ইউনিক্স মান এটি দাবি করেছে কিনা তা চেষ্টা করার কথা মনে আছে, তবে ফলাফলটি মনে নেই।
এপ্রোগ্রামার

1
@ এপ্রগ্রামগ্রাম, এটি এনকোডিং-এর থেকে পৃথক, তা বাছাই আদেশের (LC_COLLATE) এর উপর ভিত্তি করে। চরসেটের যে লোকেলে রয়েছে সেগুলিতে [a-z]সাধারণত অন্তর্ভুক্ত থাকে éবা í(তবে অগত্যা নয় ź), যে এনকোডিংয়ের কোডপয়েন্টটি একটি এবং জেড এর মধ্যে হয় বা না। কোডপয়েন্ট মানের উপর ভিত্তি করে কেবল সি লোকেল একটি সাজানোর অর্ডারের গ্যারান্টি দেয়। দেখুন এই অন্য উত্তর আরো বিস্তারিত জানার জন্য।
স্টাফেন চেজেলাস

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