সেড ক্যাপচার গ্রুপগুলি কাজ করছে না


27

আমার ফরম্যাটের একটি স্ট্রিং রয়েছে [0-9]+\.[0-9]+\.[0-9]। আমার প্রথম, দ্বিতীয় এবং তৃতীয় নম্বর আলাদাভাবে বের করতে হবে। আমি এটি যেমন বুঝতে পারি, ক্যাপচার গ্রুপগুলি এর পক্ষে সক্ষম হওয়া উচিত। আমার sed "s/\([0-9]*\)/\1/gপ্রথম সংখ্যাটি sed "s/\([0-9]*\)/\2/gপেতে, দ্বিতীয় নম্বর sed "s/\([0-9]*\)/\3/gপেতে এবং তৃতীয় নম্বর পেতে ব্যবহার করতে সক্ষম হওয়া উচিত । যদিও প্রতিটি ক্ষেত্রে আমি পুরো স্ট্রিংটি পাচ্ছি। ইহা কি জন্য ঘটিতেছে?


6
গোষ্ঠীগুলি ক্যাপচার পুরো গোষ্ঠী ক্যাপচার ... গোষ্ঠীর ব্যক্তিগত উপাদান নয়। আপনার 's/\([0-9]\)\([0-9]\)\([0-9]\).*/\1\2\3/'স্বতন্ত্র সংখ্যা ক্যাপচার করার মতো কিছু দরকার ।
মুনির

উত্তর:


45

আপনার ইনপুটটির উদাহরণ ছাড়াই আমরা আপনাকে পূর্ণ উত্তর দিতে পারি না তবে আমি আপনাকে বলতে পারি যে ক্যাপচার গ্রুপগুলির বিষয়ে আপনার বোঝার ভুল। আপনি সেগুলি ক্রমানুসারে ব্যবহার করবেন না, তারা কেবল একই প্রতিস্থাপন অপারেটরের বাম দিকে রেজেক্স উল্লেখ করে। আপনি যদি ক্যাপচার করেন, উদাহরণস্বরূপ, /(foo)(bar)(baz)/তাহলে fooহবে \1, barহবে \2এবং bazহবে \3। আপনি পারবেন না s/(foo)/\1/; s/(bar)/\2/, কারণ, দ্বিতীয় s///কলটিতে, কেবলমাত্র একটি বন্দী গোষ্ঠী রয়েছে, তাই \2এটি সংজ্ঞায়িত হবে না।

সুতরাং, আপনার তিনটি সংখ্যার গোষ্ঠী ক্যাপচার করতে আপনার এটি করতে হবে:

sed 's/\([0-9]*\)\.\([0-9]*\)\.\([0-9]*\)/\1 : \2 : \3/'

বা, আরও পাঠযোগ্য:

sed -E 's/([0-9]*)\.([0-9]*)\.([0-9]*)/\1 : \2 : \3/'

1
প্রথম উদাহরণে প্রথম বন্ধনীর হাত থেকে বাঁচার সুবিধা কী?
জোশ এম

2
@JoshM। প্যাটার্নগুলি ক্যাপচার করার জন্য তাদের এড়াতে হবে। সাধারণত /(foo)/সেড একটি আক্ষরিক (চরিত্রের সাথে মিলবে , তারপরে fooএবং তার পরে একটি আক্ষরিক )। আপনি যদি কোনও গোষ্ঠী ক্যাপচার করতে চান তবে আপনাকে হয় প্রথম বন্ধনী থেকে বাঁচতে হবে বা -Eবিকল্পটি ব্যবহার করতে হবে ।
টেরডন

আমি প্রায় সর্বদা -rপতাকা ব্যবহার করি তাই আমি ধরে নিই যে আমি এখনও এটিতে প্রবেশ করিনি।
জোশ এম

1
@JoshM। হ্যাঁ, -rপতাকাটি এটিও করবে, তবে এটি বহনযোগ্য নয়। জিএনইউ সেড এটি সমর্থন করে তবে আরও অনেকে তা সমর্থন করে না। -Eআরো সার্বজনীন।
টেরডন

9

উদাহরণ:

$ echo "123.456.78" |sed 's/\([0-9]*\)\.\([0-9]*\)\.\([0-9]*\)/\1/'
123

$ echo "123.456.78" |sed 's/\([0-9]*\)\.\([0-9]*\)\.\([0-9]*\)/\2/'
456

$ echo "123.456.78" |sed 's/\([0-9]*\)\.\([0-9]*\)\.\([0-9]*\)/\3/'
78

বা, সমস্ত একসাথে:

$ echo "123.456.78" |sed 's/\([0-9]*\)\.\([0-9]*\)\.\([0-9]*\)/\1 : \2 : \3/'
123 : 456 : 78

2

সমস্ত পালানো বন্ধনী এড়াতে -r, --regexp- প্রসারিত শেড ব্যবহার করুন।

echo "1234.567.89" | sed -r 's/([0-9]+)\.([0-9]+)\.([0-9]+)/\1, \2, \3/' 
1234, 567, 89    #output
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.