(গ্রেপ) অ-এসসিআইআই অক্ষরগুলির সাথে মেলে রেজেজ?


169

লিনাক্সে, আমার কাছে প্রচুর ফাইল সহ একটি ডিরেক্টরি রয়েছে। তাদের মধ্যে কিছুতে ASCII নন অক্ষর রয়েছে তবে তারা সমস্ত বৈধ ইউটিএফ -8 । একটি প্রোগ্রামে একটি ত্রুটি রয়েছে যা এটি ASCII নন ফাইলের সাথে কাজ করতে বাধা দেয় এবং আমাকে কতগুলি ক্ষতিগ্রস্থ হয়েছে তা খুঁজে বের করতে হবে। আমি এটি দিয়ে যাচ্ছি findএবং তারপরে অ-এসসিআইআই অক্ষরগুলি মুদ্রণের জন্য একটি গ্রেপ করব এবং তারপরে wc -lনম্বরটি সন্ধানের জন্য একটি করণীয় করব । এটি গ্রেপ হতে হবে না; আমি যে কোনও মানক ইউনিক্স নিয়মিত প্রকাশ করতে পারি , যেমন পার্ল , সেড , এডাব্লুকে ইত্যাদি

তবে, 'এমন কোনও চরিত্র যা ASCII চরিত্র নয়' এর জন্য নিয়মিত প্রকাশ আছে?


1
পল, হ্যাঁ আমি পার্ল ব্যবহার করতে পারি
ররি

/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F-\x9F]
টিনমারিনো

উত্তর:


310

এটি একটি একক অ ASCII অক্ষরের সাথে মিলবে:

[^\x00-\x7F]

এটি একটি বৈধ পিসিআরই ( পার্ল-সামঞ্জস্যপূর্ণ নিয়মিত এক্সপ্রেশন )।

আপনি পসিএক্স শর্টহ্যান্ডগুলিও ব্যবহার করতে পারেন :

  • [[:ascii:]] - একটি একক ASCII চরের সাথে মেলে
  • [^[:ascii:]] - একটি একক নন-এএসসিআইআই চরের সাথে মেলে

[^[:print:]] সম্ভবত আপনার জন্য যথেষ্ট হবে। **


3
@ অ্যাড্রিয়ানম: না, ^পিসিআরইতে বৈধ।
অ্যালিক্স অ্যাক্সেল

10
একদম ঠিক। তবে আপনাকে প্যাকগ্রিপ ব্যবহার করতে হবে, মানক গ্রেপ নয়। [^ [: মুদ্রণ:]] আপনার টার্মিনালটি ইউটিএফ 8 এ সেট আপ করা থাকলে কাজ করবে না।
ররি

@ ররি, কেন :print:কোনও ইউটিএফ 8 টার্মিনালে কাজ করবে না? এটি ইউটিএফ 8 টার্মিনালে আমার পক্ষে কাজ করে:27.chr =~ /[^[:print:]]/
akostadinov

খারাপ ফাইল নাম ঠিক করার জন্য এটি সত্যিই দুর্দান্ত - rename 's/[^\x00-\x7F]//g' *(আপনি -nনামটি ভাল করে পরীক্ষা করতে প্রথমে ঠিক আছে কিনা তা ব্যবহার করতে পারেন )।
nnot101

আমি ইউটিএফ 8 নন এমন কোনও চরিত্র এবং অন্য কোনও নির্দিষ্ট অক্ষরের সাথে কীভাবে মিল করব?
সিএমসিডিগ্রাগনকাই

37

না, [^\x20-\x7E]এএসসিআইআই নয়।

এটি আসল এএসসিআইআই:

 [^\x00-\x7F]

অন্যথায়, এটি নিউলাইনগুলি এবং অন্যান্য বিশেষ অক্ষরগুলি ছাঁটাই করবে যা ASCII টেবিলের অংশ!


5

আপনি এই পৃষ্ঠাটি যাচাই করতে পারেন: ইউনিকোড নিয়মিত এক্সপ্রেশন , যেমন এতে কিছু কার্যকর ইউনিকোড অক্ষর শ্রেণি রয়েছে যেমন:

\ পি {নিয়ন্ত্রণ}: একটি ASCII 0x00..0x1F বা লাতিন -1 0x80..0x9F নিয়ন্ত্রণ অক্ষর।


3

[^\x00-\x7F]এবং [^[:ascii:]]কিছু কন্ট্রোল বাইট মিস করে তাই কখনও কখনও স্ট্রিং সর্বোত্তম বিকল্প হতে পারে। উদাহরণস্বরূপ cat test.torrent | perl -pe 's/[^[:ascii:]]+/\n/g'আপনার টার্মিনালটিতে অদ্ভুত জিনিসগুলি strings test.torrentকরবে , যেখানে এটি আচরণ করবে।


3

পাঠ্য বাক্স যাচাইয়ের জন্য এস্কিই গ্রহণ করুন কেবলমাত্র এই প্যাটার্নটি ব্যবহার করুন

[\x00-\x7F]+


3

আমি ব্যবহার করি [^\t\r\n\x20-\x7E]+এবং এটি ঠিকঠাক কাজ করছে বলে মনে হচ্ছে।


2

আপনি এই রেজেক্স ব্যবহার করতে পারেন:

[^\w \xC0-\xFF]

কেস জিজ্ঞাসা করুন, বিকল্পগুলি মাল্টিলাইন


2

আপনার সত্যিকার অর্থে একটি রেজেক্সের দরকার নেই।

printf "%s\n" *[!\ -~]*

এটি তাদের নামগুলিতেও নিয়ন্ত্রণের অক্ষরের সাথে ফাইলের নামগুলি দেখায় তবে আমি এটি একটি বৈশিষ্ট্য হিসাবে বিবেচনা করি।

আপনার যদি কোনও মিলে যাওয়া ফাইল না থাকে তবে আপনি nullglobসেট না করে গ্লোব কেবলমাত্র নিজের মধ্যে প্রসারিত হবে । (এক্সপ্রেশনটি নিজের সাথে মেলে না, তাই প্রযুক্তিগতভাবে, এই আউটপুটটি দ্ব্যর্থহীন)


Belatedly, আমি পালন করতে পারে এই কাজ করে যদি আপনি আসলে কিছু ফাইল যা এই প্যাটার্ন মেলে আছে সঠিকভাবে হবে। কোনও মিল নেই যখন প্যাটার্নটি নিজেই মুদ্রণ করে সে আচরণটি কিছুটা আশ্চর্যজনক তবে বাস্তবে সঠিক। আমি উত্তরটি সম্পাদনা করে আশা করি এটি স্পষ্ট করে বললাম।
ট্রিপলি

1

এটি খুব নমনীয় এবং এক্সটেনসিবল পরিণত হয়েছিল। $ ক্ষেত্র = ~ গুলি / [^ \ x00- \ x7F] // জি; # এইভাবে সমস্ত ASCII বা প্রশ্নে থাকা নির্দিষ্ট আইটেমগুলি পরিষ্কার করা যেতে পারে। আইটেমগুলির নির্বাচন বা প্রাক প্রসেসিংয়ে খুব ভাল যা শেষ পর্যন্ত হ্যাশ কী হয়ে উঠবে।

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