প্লেইন ব্যাশে রিজেক্সপ ব্যবহার করে সাবস্ট্রিংটি বের করুন


101

আমি ব্যাশ ব্যবহার করে স্ট্রিং থেকে সময় বের করার চেষ্টা করছি এবং এটি খুঁজে পেতে আমার খুব কষ্ট হচ্ছে।

আমার স্ট্রিং এর মতো:

US/Central - 10:26 PM (CST)

এবং আমি 10:26অংশটি বের করতে চাই ।

কেউ কেবল বাশ দিয়ে এটি করার একটি উপায় সম্পর্কে জানেন - সেড, অজানা ইত্যাদি ব্যবহার না করে?

যেমন, পিএইচপি-তে আমি ব্যবহার করব - সবচেয়ে ভাল উপায় নয়, তবে এটি কাজ করে - এরকম কিছু:

preg_match( ""(\d{2}\:\d{2}) PM \(CST\)"", "US/Central - 10:26 PM (CST)", $matches );

যেকোন সহায়তার জন্য ধন্যবাদ, যদিও উত্তরটি সেড বা অজানা ব্যবহার করে

উত্তর:


214

খাঁটি ব্যবহার :

$ cat file.txt
US/Central - 10:26 PM (CST)
$ while read a b time x; do [[ $b == - ]] && echo $time; done < file.txt

বাশ রেইগেক্স সহ আরও একটি সমাধান:

$ [[ "US/Central - 10:26 PM (CST)" =~ -[[:space:]]*([0-9]{2}:[0-9]{2}) ]] &&
    echo ${BASH_REMATCH[1]}

grepঅ্যাডভান্সড রেগেক্স ব্যবহার এবং সন্ধানের জন্য আরও একটি সমাধান :

$ echo "US/Central - 10:26 PM (CST)" | grep -oP "\-\s+\K\d{2}:\d{2}"

সেড ব্যবহার করে অন্য একটি সমাধান:

$ echo "US/Central - 10:26 PM (CST)" |
    sed 's/.*\- *\([0-9]\{2\}:[0-9]\{2\}\).*/\1/'

পার্ল ব্যবহার করে অন্য একটি সমাধান:

$ echo "US/Central - 10:26 PM (CST)" |
    perl -lne 'print $& if /\-\s+\K\d{2}:\d{2}/'

এবং শেষটি অবাস্তব ব্যবহার করে:

$ echo "US/Central - 10:26 PM (CST)" |
    awk '{for (i=0; i<=NF; i++){if ($i == "-"){print $(i+1);exit}}}'

কুল! প্যাটার্নটিতে আমি কোনও হাইফেনও "-" ব্যবহার করি? কারণ সেই গ্রেপ কিছু ম্যাচ
ফেরায়

আমি সম্ভবত পার্ল সমাধানটি পেতে পারি, তবে এটি একটি দুর্দান্ত প্লাস। ধন্যবাদ!
andrux

মজাদার জন্য যোগ করা এক
বিস্মৃত

4
আমাকে "কে" কৌশল "জানাতে ধন্যবাদ" Thank পার্ল সিনট্যাক্স সহ গ্রেপ সত্যই শক্তিশালী।
মার্কো সুল্লা

4
আমি sedসংস্করণটি পছন্দ করি তবে অন্যকে সতর্ক করতে চেয়েছিলাম যা sedঅগত্যা +সংশোধক না নেয় take চারপাশে কাজ করার একটি উপায় হ'ল {1, }এক বা একাধিক ম্যাচের জন্য সংশোধক ব্যবহার করা ।
কোডব্রু

94
    echo "US/Central - 10:26 PM (CST)" | sed -n "s/^.*-\s*\(\S*\).*$/\1/p"

-n      suppress printing
s       substitute
^.*     anything at the beginning
-       up until the dash
\s*     any space characters (any whitespace character)
\(      start capture group
\S*     any non-space characters
\)      end capture group
.*$     anything at the end
\1      substitute 1st capture group for everything on line
p       print it

8
আমার মনে হচ্ছে এটি আমাকে তাত্ক্ষণিক সেড মাস্টার করেছে। একটি ভাল বিকল্প যা আমি টুইট করতে পারি তার চেয়ে নয়টি আমি বুঝতে পারি না better
নমনেন

বিশদ ব্যাখ্যার জন্য ধন্যবাদ, ভবিষ্যতে "আমি কীভাবে এক্সএক্সএক্সএক্সএক্সএক্স" পোস্টগুলি এড়াতে সহায়তা করি।
স্টুডিজ

4
আপনি কেন প্রথমে মুদ্রণটি দমন করেন -nতারপরে আবার মুদ্রণের জন্য অনুরোধ করবেন /p? -nপতাকাটি বাদ দেওয়া এবং /pনির্দেশটি বাদ দেওয়া কি একই হবে না ? ধন্যবাদ
ভিক্টর জামামানিয়ান

দুর্দান্ত উত্তর! আপনার সহায়তার জন্য ধন্যবাদ :-)
ব্রুনো লাভিট

4
@VictorZamanian থেকে এখানে : "। ডিফল্টভাবে, কিন্তু কপি করে প্রিন্ট যে লাইন এটি একটি প্রতিকল্পন করে তোলে, নতুন পাঠ্য পরিবর্তে পুরাতন এক ছাপা হয় আপনি sed একটি ঐচ্ছিক যুক্তি ব্যবহার করেন, তাহলে।" -N sed, "এটা না করবে না, ডিফল্টরূপে, যে কোনও নতুন লাইন মুদ্রণ করুন ... ... "-n" বিকল্পটি ব্যবহার করা হলে, "পি" পতাকাটি পরিবর্তিত রেখাটি মুদ্রণের কারণ ঘটাবে। "
tdashroy

27

তাত্ক্ষণিকভাবে নোংরা, রেজেক্সমুক্ত, নিম্ন-দৃust়তার চপ-চপ কৌশল

string="US/Central - 10:26 PM (CST)"
etime="${string% [AP]M*}"
etime="${etime#* - }"

6
এটি এত জঘন্য ময়লা যে আমি লজ্জা পাচ্ছি আমি নিজেই এটি ভাবিনি। +1 | read zone dash time apm zoneখুব বেশি কাজ করে
ওড়ওলোফিল

খুব পরিষ্কার, এবং বাহ্যিক প্রোগ্রামগুলিতে কল এড়ানো হয়।
ভিক্টর জামামানিয়ান

12
হাই, এটি আরও 10x বেশি কার্যকর হবে যদি এটিতে আরও ডকুমেন্টেশন বা কৌশলটির আশেপাশের কিছু নামগুলির একটি রেফারেন্স অন্তর্ভুক্ত থাকে যাতে লোকেরা গিয়ে আরও গবেষণা করতে পারে। আগ্রহীদের জন্য, এটি বাশ স্ট্রিং ম্যানিপুলেশন, এবং আপনি এখানে আরও বিশদ জানতে পারেন: tldp.org/LDP/abs/html/string-manipulation.html
পেড্রো মাতা-মুরোস

2

যদি আপনার স্ট্রিং হয়

foo="US/Central - 10:26 PM (CST)"

তারপর

echo "${foo}" | cut -d ' ' -f3

কাজ করবে


4
বা cut -c14-18অবশ্যই যতক্ষণ অক্ষরের অবস্থান পরিবর্তন হচ্ছে না। টাইমজোন স্থির থাকলে যা হওয়া উচিত নয়।
মারকাস

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