সেডে নিয়মিত প্রকাশে [\ w] + কীভাবে ব্যবহার করবেন?


24

আমি উইন্ডোতে আছি, তবে আমার ধারণা এখনও আমার প্রশ্নটি এখানে যথাযথভাবে রাখা আছে।

C:\Users\User>grep --version
GNU grep 2.6.3

C:\Users\User>sed --version
GNU sed version 4.2.1

আমি লক্ষ্য করেছি যে নিম্নলিখিত কাজগুলি (আউটপুট here):

echo here | grep -E "\w+"
echo here | grep -E "[her]+"

তবে, এটি কাজ করে না (কিছুই আউটপুট করে না):

echo here | grep -E "[\w]+"

এটি আবার করে (আউটপুটটিং here):

echo here | grep -P "[\w]+"

সুতরাং [\w]পার্ল রেগুলার এক্সপ্রেশনের কিছু নির্দিষ্ট হয়, আমি অনুমান। এটা কি ঠিক?

সুতরাং, আসুন কথা বলা যাক sed। এটি কাজ করে (আউটপুটটিং gone):

echo here | sed -r "s/\w+/gone/"
echo here | sed -r "s/[her]+/gone/"

এবং আবারও, এটি (আউটপুটটিং here) করে না :

echo here | sed -r "s/[\w]+/gone/"

এখন, আমি সেডের জন্য পার্লের নিয়মিত প্রকাশগুলি কীভাবে সক্রিয় করতে পারি - কোনও উপায় আছে?

উত্তর:


11

এর বিভিন্ন সরঞ্জাম এবং সংস্করণগুলি নিয়মিত প্রকাশের বিভিন্ন রূপকে সমর্থন করে। প্রত্যেকের ডকুমেন্টেশন আপনাকে বলবে যে তারা কী সমর্থন করে।

স্ট্যান্ডার্ডগুলি বিদ্যমান যাতে কোনও মান্যকারী সমস্ত অ্যাপ্লিকেশন জুড়ে পাওয়া যায় এমন ন্যূনতম বৈশিষ্ট্যগুলির সেটগুলিতে নির্ভর করতে পারে।

উদাহরণস্বরূপ, পসআইএক্স দ্বারা নির্দিষ্ট হিসাবে বেসিক নিয়মিত এক্সপ্রেশনগুলির সমস্ত আধুনিক বাস্তবায়ন sedএবং grepপ্রয়োগ করে (কমপক্ষে একটি সংস্করণ বা মানের অন্যটি, তবে সেই মানটি গত কয়েক দশকগুলিতে সে ক্ষেত্রে খুব বেশি বিকশিত হয়নি)।

পজিক্স BRE এবং ERE এ আপনার [:alnum:]চরিত্র শ্রেণি রয়েছে। এটি আপনার লোকালে অক্ষর এবং অঙ্কগুলির সাথে মেলে (নোট যে সিলে না থাকলে প্রায়শই অনেক কিছু অন্তর্ভুক্ত থাকে a-zA-Z0-9)।

তাই:

grep -x '[[:alnum:]_]\{1,\}'

এক বা একাধিক alnums বা _ এর সাথে মেলে।

[\w]POSIX দ্বারা ব্যাকস্ল্যাশ বা মেলানোর জন্য প্রয়োজনীয় w। সুতরাং আপনি যেখানে উপলব্ধ grepবা এমন কোনও sedপ্রয়োগ খুঁজে পাবেন না (অ-মানক বিকল্পগুলির মাধ্যমে না করে)।

\wএকা জন্য আচরণ POSIX দ্বারা নির্দিষ্ট করা হয় না, তাই বাস্তবায়ন তারা যা চায় তা করার অনুমতি দেওয়া হয়। জিএনইউ grepযোগ করেছে অনেক দিন আগে।

গনুহ grep(যদিও এটা তার নিজস্ব কপি এম্বেড করে) একটি নিজস্ব regexp ইঞ্জিন তবে এটা এখন গনুহ libc এর একটি ব্যবহার আছে ব্যবহৃত।

এটি আপনার লোকালে অ্যালাম এবং আন্ডারস্কোরের সাথে মেলে meant তবে বর্তমানে এটির একটি বাগ রয়েছে যে এটি কেবলমাত্র একক-বাইট অক্ষরগুলির সাথে মেলে (উদাহরণস্বরূপ, কোনও ইউটিএফ -8 লোকালে এটি স্পষ্টভাবে একটি অক্ষর নয় যদিও এটি মিলছে all যেখানে সমস্ত লোকাল যেখানে single একক é চরিত্র)।

এখানে একটা হয় \wPerl regexp এবং PCRE মধ্যে regexp অপারেটর। পিসিআরই / পার্ল পোসিক্স নিয়মিত এক্সপ্রেশন নয়, এগুলি পুরোপুরি কেবল অন্য একটি জিনিস।

এখন, জিএনইউ যেভাবে grep -Pপিসিআরই ব্যবহার করে, এটি ছাড়াও একই সমস্যা পেয়েছে -P। এটি ব্যবহার করে যদিও এটির চারপাশে কাজ করা যেতে পারে (*UCP)(যদিও এটি ইউটিএফ 8 অ স্থানীয় অবস্থানেও পার্শ্ব প্রতিক্রিয়া রয়েছে)।

GNU sedGNU libc এর নিজস্ব regexps এর জন্য regexs ব্যবহার করে। এটি এটি এমনভাবে ব্যবহার করে যদিও এটিতে জিএনইউর মতো বাগ নেই grep

জিএনইউ sedপিসিআরই সমর্থন করে না। কোডটিতে কিছু প্রমাণ রয়েছে যা এর আগে চেষ্টা করা হয়েছিল, তবে এটি আর এজেন্ডায় রয়েছে বলে মনে হয় না।

আপনি যদি পার্লের নিয়মিত প্রকাশ চান perlতবে কেবল ব্যবহার করুন ।

অন্যথায়, আমি বলতে চাই যে আপনার sed/ এর নির্দিষ্ট প্রয়োগের একটি বোগাস অ-মানক বৈশিষ্ট্যের উপর নির্ভর করার পরিবর্তে grep, মান এবং ব্যবহারের সাথে আঁকানো ভাল [_[:alnum:]]


[_[:alnum:]]এটি একটি দুর্দান্ত কাজ যা আমাকে এটির মতো বাড়ানোর অনুমতি দেয় [\w/]( [_[:alnum:]/]সেই ক্ষেত্রে)।
bers

1
এই উত্তরটি এখন GNU এর সীমাবদ্ধতার সাথে সেকেলে grep
স্টাফেন চেজেলাস

7

আপনি সঠিক - \wএটি পিসিআরই অংশ - পার্ল সামঞ্জস্যপূর্ণ নিয়মিত এক্সপ্রেশন। যদিও এটি 'স্ট্যান্ডার্ড' রেজেক্সের অংশ নয়। http://www.regular-expressions.info/posix.html

কয়েকটি সংস্করণ sedএটিকে সমর্থন করতে পারে তবে আমি সবচেয়ে সহজ উপায়টি হ'ল পতাকাটি নির্দিষ্ট করে মোডে ব্যবহার perlকরা । (পাশাপাশি )। (আরও বিস্তারিত )sed-p-eperlrun

তবে []সেই উদাহরণে আপনার চারপাশের দরকার নেই - এটি বৈধ স্টাফগুলির গ্রুপগুলির জন্য।

echo here  | perl -pe 's/\w+/gone/'

বা উইন্ডোজে:

C:\>echo here  | perl -pe "s/\w+/gone/"
gone
C:\>echo here  | perl -pe "s/[\w\/]+/gone/"
gone

দেখুন perlreআরো PCRE কাপড় জন্য।

আপনি এখানে পার্ল পেতে পারেন: http://www.activestate.com/activeperl/downloads


আমার প্রশ্নের মধ্যে \wএবং পার্থক্য নোট করুন [\w]। কোনটি কাজ করছে এবং কোনটি নয় এটি পরিষ্কার করার জন্য আমি প্রতিটি কমান্ডের আউটপুট দিয়ে আপডেট করব। বিশেষত, sedবুঝতে পারে \w, কিন্তু না [\w]। এছাড়াও, আমার [\w]কাজ করা প্রয়োজন কারণ আমি [\w/]উদাহরণ হিসাবে ব্যবহার করতে চাই ।
বিয়ার

যে ক্ষেত্রে এটি সম্ভবত একটি উদ্ধৃতি সমস্যা। যে কোনও উপায়ে - perlএটি করতে পারেন :)।
সোবারিক

ধন্যবাদ! স্টাফেন চেজেলাসের উত্তর আমার কাছে যা চেয়েছিল তার চেয়ে একটু কাছে (যেহেতু আমার কাছে পার্ল ইনস্টল নেই - একটি ডু বি বি উইন্ডোজ ব্যবহারকারী, আমার ধারণা), তাই আমি তার উত্তরটি মেনে নিয়েছি।
bers

এটি ঠিক আছে - তবে আমি পার্লটি উইন্ডোজ ইনস্টল করার পরামর্শ দেব। এটি আমার প্রথম জিনিসগুলির মধ্যে একটি এবং এটি আমি অত্যন্ত সহায়ক বলে মনে করি।
সোব্রিক

\wপার্লে থাকার আগে জিএনইউ গ্রেপ (৮০ এর দশকে) এবং জিএনইউ ইম্যাকসে সম্ভবত এর আগেও ছিল।
স্টাফেন চেজেলাস

1

আমি সন্দেহ করি grepএবং sedকখন প্রয়োগ করব []এবং কখন প্রসারিত করব তা ভিন্নভাবে সিদ্ধান্ত নিচ্ছি \w। পার্ল ইন রেজেক্সের \wঅর্থ কোনও শব্দের অক্ষর, এবং []কোনও গ্রুপকে ম্যাচ হিসাবে প্রয়োগ করতে কোনও গ্রুপকে সংজ্ঞায়িত করে। আপনি যদি এর \wআগে "প্রসারিত" করেন তবে []এটি সমস্ত শব্দের অক্ষরের একটি অক্ষর শ্রেণি হবে। যদি এর পরিবর্তে আপনি []প্রথমে করেন তবে আপনার দুটি চরিত্রের সাথে একটি অক্ষর শ্রেণি রয়েছে \এবং wসুতরাং এটি দুটি অক্ষরের একটি বা একাধিক সমন্বিত কোনও প্যাটার্নের সাথে মেলে।

সুতরাং এটি দেখে মনে হচ্ছে যে এটি বিশেষ ক্রম হিসাবে এবং কীভাবে সম্মান না করে সম্মতি দেখানোর পরিবর্তে মিলিত হওয়ার জন্য যথাযথ অক্ষর রয়েছে তা হিসাবে sedদেখছে []এবং আচরণ করছে । অবশ্যই, উদাহরণস্বরূপ এগুলি সম্পূর্ণ অপ্রয়োজনীয়, তবে কেউ সম্ভবত এটি গুরুত্বপূর্ণ মনে করতে পারে এমন পরিস্থিতিগুলি কল্পনা করতে পারে তবে আপনি প্যারেনস এবং ওআরএস দিয়ে এটিকে কাজ করতে পারেন।\wperlgrep[]


আমি যদি অবাক হতাম তাই হত। \ এটি একটি পালানোর কোড, এবং আপনি এটিকে ডিলিমিটরগুলি থেকে বাঁচার জন্য ব্যবহার করবেন। সহজাতভাবে এর অর্থ এটি অন্য যে কোনও জিনিসের চেয়ে উচ্চতর প্রাধান্য অর্জন করতে হবে। আমি মনে করি এটি সম্ভবত কার্যকর \wহয় না কারণ এটি নিয়মিত প্রকাশের
অনুমানের

ঠিক আছে, অভিজ্ঞতার সাথে মনে হয় এটি আমার জন্য gnu সেড ব্যবহার করে: echo whe\\ere | sed -r 's/[\w]+/gone/gআমাকে gonehegoneereযেমন এটি ` and ডাব্লু'র সাথে মিলছে এবং প্রতিস্থাপনটি করছে
এরিক

আমি এরিক রেনোফ কী দেখছে তা নিশ্চিত করতে পারি। সুতরাং আমরা কোনওভাবে ব্যাকস্ল্যাশটি অনস্কেপ করতে চাই? :)
bers

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