বাশ স্ক্রিপ্টে নিয়মিত প্রকাশ


12

এটি আমার প্রথম বারের বাশ স্ক্রিপ্টিং তাই আমি সম্ভবত একটি সহজ ভুল করছি।

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

এখনও অবধি আমার কাছে এটি রয়েছে:

#!/bin/bash

regex="^([a-zA-Z0-9\-_]+ : [a-zA-Z0-9\-_]+) (usergroup)$"

# example output
groups="username : username usergroup"

echo "$groups" >> /home/jrdn/log

if [[ "$groups" =~ $regex ]]; then
    echo "Match!" >> /home/jrdn/log
else
    echo "No match" >> /home/jrdn/log
fi

প্রতিটি জায়গায় আমি এই রেজেক্স চেষ্টা করেছি, এটি কাজ করে। কিন্তু ব্যাশ স্ক্রিপ্টের মধ্যে, এটি শুধুমাত্র কি কখনো আউটপুট $groups, দ্বারা অনুসরণ No match। তাহলে কেউ আমাকে বলতে পারে যে এতে কী দোষ রয়েছে?


1
আপনার কী মনে হয় যে এতে কোনও ভুল আছে?
manatwork

1
@ জর্দ্ন্নন্নাহ তারপরে ধীরে ধীরে আপনার টার্গেট রেজিএক্সএক্স পুনরায় তৈরি করার চেষ্টা করুন, প্রথম ম্যাচ করুন ^([a-zA-Z0-9\-_]+)তারপর কোলন যুক্ত করুন এবং আরও ... আপনার খুব শীঘ্রই খুঁজে পাওয়া উচিত, সমস্যাটি কোথায়।
পিটার্ফ

2
এখানে ব্যাশ 4.2.45 এর সাথে একই। আন্ডারস্কোরটি এড়িয়ে যাওয়া এটি ঠিক করে দিয়েছে। রহস্যময়। @ jrdnhannah আপনি কি উত্তর হিসাবে এটি লিখতে এবং দয়া করে এটি গ্রহণ করতে পারেন?
টেরডন

1
যেহেতু আমি কেবল ইউনিক্স এসইতে সাইন আপ করেছি, তাই আমার নিজের উত্তর দেওয়ার আগে আমাকে 8 ঘন্টা অপেক্ষা করতে হবে। যদিও অন্য কেউ যদি তা করে তবে উত্তর হিসাবে চিহ্নিত করে খুশি।
jrdn

4
@ স্টারডন বাশ কেবলমাত্র লিবিসি'র রেজেক্স ফাংশনগুলিকে কল করে। সুতরাং এটি libc সংস্করণ উপর নির্ভর করে, বাশ সংস্করণ নয়। আমার উত্তরটি দেখুন ... (অথবা আপনি ব্যবহার করতে পারেন এমন কোলেশন ক্রমের
উপরেও

উত্তর:


13

থেকে man 7 regex:

একটি ব্রাকেট এক্সপ্রেশন হ'ল "[]" এ আবদ্ধ অক্ষরের একটি তালিকা। ...

… আক্ষরিক '-' অন্তর্ভুক্ত করার জন্য এটিকে প্রথম বা শেষ চরিত্রটি তৈরি করুন…। [এ] 'including' সহ অন্যান্য বিশেষ অক্ষরগুলি বন্ধনী হিসাবে প্রকাশের মধ্যে তাদের বিশেষ তাত্পর্য হারাবে।

Egrep দিয়ে regexp চেষ্টা করে একটি ত্রুটি দেয়:

$ echo "username : username usergroup" | egrep "^([a-zA-Z0-9\-_]+ : [a-zA-Z0-9\-_]+) (usergroup)$"
egrep: Invalid range end

এখানে একটি সহজ সংস্করণ, এটি একটি ত্রুটিও দেয়:

$ echo 'hi' | egrep '[\-_]'
egrep: Invalid range end

যেহেতু \বিশেষ নয়, এটি একটি পরিসীমা, ঠিক যেমন [a-z]হবে। আপনার -নিজেরটি শেষের দিকে রাখা দরকার [_-]:

echo "username : username usergroup" | egrep "^([a-zA-Z0-9_-]+ : [a-zA-Z0-9_-]+) (usergroup)$"
username : username usergroup

এটি আপনার লিবিসি সংস্করণ নির্বিশেষে কাজ করবে (উদাহরণস্বরূপ)

সম্পাদনা: এটি আসলে আপনার স্থানীয় সেটিংসের উপরও নির্ভর করে। ম্যানপেজটি এই সম্পর্কে সতর্ক করে:

সীমাগুলি খুব কোলাটিং-সিকোয়েন্স-নির্ভর, এবং পোর্টেবল প্রোগ্রামগুলি তাদের উপর নির্ভর করা এড়ানো উচিত।

উদাহরণ স্বরূপ:

$ echo '\_' | LC_ALL=en_US.UTF8 egrep '[\-_]'
egrep: Invalid range end
$ echo '\_' | LC_ALL=C egrep '[\-_]'
\_

অবশ্যই এটি ত্রুটি না করলেও এটি আপনি যা চান তা করছে না:

$ echo '\^_' | LC_ALL=C egrep '^[\-_]+$'
\^_

এটা একটা পরিসীমা, হওয়া ASCII এ, যার আছে \, [, ^, এবং _


মজাদার. আমার egrepকোনও ত্রুটি দেয় না, কেবল এটির সাথে সঠিকভাবে মেলে।
manatwork

@ আপনার মিলনের ক্রমটি পরিচালনা করুন সম্ভবত পরিসীমাটিকে মঞ্জুরি দেয় ....
ডারউবার্ট

কোলেশন সম্পর্কে আমি বেশি কিছু জানি না। আপনি এই মানে : LC_COLLATE="en_US.UTF-8"?
manatwork

@ মান্যাটওয়ার্ক একটি উদাহরণ দেওয়ার জন্য আমি প্রশ্নটি সম্পাদনা করেছি। নোট করুন এটি আপনার সিস্টেমে আলাদা হতে পারে, কারণ কখনও কখনও সেই সংযোগগুলি (বাছাই করা) ক্রমগুলি পরিবর্তিত হয়।
ডারোবার্ট

1
@ মানাটওয়ার্ক ঠিক আছে, পালানোর চেষ্টা লক্ষ্য করার আগে আমি প্রায় একটি বাগ রিপোর্ট দায়ের করেছি -...
ডারবার্ট

4

রিজেক্সপস (এবং কোডের বৃহত টুকরোতে যে কোনও বাগ) এর সাথে সাধারণ নিয়ম: এটিকে কেটে ফেলুন এবং ধাপে ধাপে এটি পুনর্নির্মাণ করুন বা দ্বিখণ্ডিত ব্যবহার করুন - যা আপনার পক্ষে ভাল কাজ করে।

এই ক্ষেত্রে অপরাধী আন্ডারস্কোর হিসাবে প্রমাণিত হয়েছিল - একটি ব্যাকস্ল্যাশ দিয়ে এড়িয়ে যাওয়া এটিকে কাজ করে তোলে।

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