গ্রেড আউটপুট সিডির পথ হিসাবে কীভাবে ব্যবহার করবেন?


9

কমান্ডের grepআর্গুমেন্ট হিসাবে আমি কীভাবে আউটপুট পাইপ করতে পারি cd?

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

[root@xxx xxx]# pip install django | grep '/usr.*'  
Requirement already satisfied (use --upgrade to upgrade): django in   /usr/lib64/python2.7/site-packages

এখানে /usr/lib64/python2.7/site-packagesহাইলাইট করা হয়েছে এবং আমি এই স্ট্রিংটি পাস করতে চাই cd

উত্তর:


16

বাশের কমান্ড প্রতিস্থাপন ব্যবহার করুন $(), আপনাকে -oকেবল ম্যাচ করা অংশটি নির্বাচন করতে গ্রেপ দিয়েও প্রয়োজন :

cd "$(pip install django | grep -o '/usr.*')"

নোট করুন যদিও আপনি এই ক্ষেত্রে দূরে সরে যাবেন তবে আপনার সর্বদা ডাবল উদ্ধৃতি দিয়ে কমান্ড প্রতিস্থাপনটি বন্ধ করা উচিত যাতে শেলটি শ্বেত স্পেসে শব্দ বিভাজন সম্পাদন করে না (ডিফল্ট স্পেস, ট্যাব এবং নিউলাইন দ্বারা, IFSচলকের ক্ষেত্রে নির্ভর করে bash)।


9

আপনি কী করবেন তার উপর নির্ভর করে এবং pipআউটপুট কী হবে সে সম্পর্কে আগেই জানেন না , আপনি grepঅন্য কোনও কিছুর জন্য সিদ্ধান্ত নিতে পারেন /usr.*

আপনি কি জানেন সঙ্গে ডিরেক্টরির শুরু/usr (এবং এটি থেকে আউটপুট লাইনের শেষে প্রদর্শিত হবে pip, এবং যে /usrডিরেক্টরি নাম আগে লাইন কোথাও প্রদর্শিত হবে না), তারপর যে একটি সূক্ষ্ম পছন্দ; হিমাইলের উত্তর আপনাকে জানায় কীভাবে।

আপনি যে কারণে এটি শুরু করে তা জানার কারণটি/usr হ'ল আপনি কেবল কমান্ডটি চালিয়েছেন এবং আপনি যে ডিরেক্টরিটি পরিবর্তন করতে চান তা জানেন, আমি কমান্ডটি চালানোর সহজ সমাধানের পরামর্শ দিই cd /usr/lib64/python2.7/site-packages। আপনি ট্যাব সমাপ্তি ব্যবহার না করলেও এটি টাইপিং কম ।

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

আপনি কি জানেন ডিরেক্টরির নাম পরম (অর্থাত, একটি দিয়ে শুরু হয় /) এবং কোন /ডিরেক্টরি নাম আগে লাইনে প্রদর্শিত হয় , আপনি হিসাবে একই regexp ব্যবহার করতে পারেন heemayl এর উত্তর কিন্তু /পরিবর্তে /usr:

cd "$(pip install django | grep -o '/.*')"

এটি কোনও বর্ণ ( ) এর /শূন্য বা তার বেশি ( *) এর সাথে মিলে যায় .

আপনি যদি জানেন যে ডিরেক্টরি নামের কোনও অনুভূমিক সাদা স্থান নেই (ফাঁকা জায়গা বা ট্যাব নেই) এবং লাইনটির শেষে প্রদর্শিত হয় , আপনি ব্যবহার করতে পারেন:

cd "$(pip install django | grep -oP '[^\h]+$')"

এখানে আমি একটি পার্ল রিজেক্সপ ( -P) ব্যবহার করেছি কারণ \hসংক্ষিপ্তকরণ (এর জন্য [:blank:]) টাইপ করা এবং সমান বর্ধিত রিজেক্সএক্স ( -E) এর চেয়ে পড়া সহজ করে তোলে । এই এক বা একাধিক (ম্যাচ +) অক্ষরের একটি শ্রেণী (যে কোন চরিত্রের [ ]) যে না ( ^) একটি স্থান বা ট্যাব ( \h)।

যদি আপনি জানেন তবে তার ডিরেক্টরি নামের সাথে সাথে তার আগেই inঅনুভূমিক সাদা স্থান (যেমন, বাম এবং ডানদিকে ফাঁকা দিয়ে আবদ্ধ) দ্বারা ঘিরে রয়েছে এবং লাইনে কেবল এই ঘটনাটিইin আপনি ব্যবহার করতে পারেন:

cd "$(pip install django | grep -oP '\hin\h+\K.+')"

এটি শূন্য-প্রস্থের ইতিবাচক চেহারা-পিছনের দৃ (়তা ( \K) ব্যবহার করে এক বা একাধিক অক্ষরের সাথে মিলিত করতে ( .+) যা কোনও স্থান বা ট্যাব ( \h) পরে প্রদর্শিত হবে inএবং অন্য এক বা একাধিক স্পেস বা ট্যাব ( \h+) প্রকৃতপক্ষে inএবং ফাঁকা ফাঁকা স্থান ব্যতীত ম্যাচে এটি ঘিরে লুক-আশেপাশের দৃ় প্রতিজ্ঞাগুলি পার্ল নিয়মিত এক্সপ্রেশনগুলির একটি বৈশিষ্ট্য।

প্যাটার্নটিও কাজ করতে পারত, তবে আমাদের উপস্থিত থাকা নির্বিশেষে আমাদের কেবল আগে একটি ফাঁকা সন্ধান করতে হবে। বিপরীতে, আমাদের অবশ্যই সমস্ত শূন্যস্থান মেলে ফেলতে হবে , বা সেগুলি ফেলে দেওয়া হবে না এবং সেগুলি ডিরেক্টরি নামের অংশ হিসাবে মিলবে।\h+in\h+\K.+inin\K

আপনি কি জানেন ডিরেক্টরির নাম অবিলম্বে লাইন এর পূর্বে করা হয় গত সংঘটন inঅনুভূমিক হোয়াইটস্পেস দ্বারা অনুসরণ , আপনি ব্যবহার করতে পারেন:

set +H
cd "$(pip install django | grep -oP '\hin\h+(?!.*\hin\h.*)\K.*')"
set -H

সেখানে, শূন্য-প্রস্থের ইতিবাচক চেহারা-পিছনে দৃser়পত্রে নিজেই একটি শূন্য-প্রস্থের নেতিবাচক চেহারা-এগিয়ে জোর দেওয়া ( (?! )) রয়েছে।

!এমনভাবে কঠিন হতে হিসেবে দেখা অব্যাহতি এইরূপ সূচারূভাবে; পাস করার আগে শেল ইতিহাসের সম্প্রসারণকে ট্রিগার করা থেকে রোধ করার জন্য আমি যে পদ্ধতিটি ব্যবহার করেছি তা grepহ'ল set +Hকমান্ডটি চালানোর আগে অস্থায়ীভাবে ইতিহাসের প্রসারণ ( ) অকার্যকর করা এবং set -Hএরপরে এটি পুনরায় সক্ষম করুন । আপনি যদি এটি কোনও স্ক্রিপ্টে ব্যবহার করে থাকেন এবং আপনার স্ক্রিপ্টটি এতে না রাখে set -H, ইতিহাসের বিস্তারটি কেবল স্বয়ংক্রিয়ভাবে সক্ষম হয়ে গেলে কেবল শেল ইন্টারেক্টিভভাবে চালিত হয়।

সবশেষে লক্ষ করুন যে এগুলির কোনওটিই বা হিমাইলের উত্তরগুলি আসলে আউটপুটটি পাইপ করছে grepনা cd(যদিও আউটপুটটি pipএখনও পাইপ করা হচ্ছে grep)। পাইপগুলির পরিবর্তে , এই কাজের উপযুক্ত সরঞ্জাম হ'ল কমান্ড প্রতিস্থাপন


অবশ্যই, আপনি প্রযুক্তিগত পেতে চাইলে , শেলটি কমান্ড আউটপুট পড়ার জন্য অভ্যন্তরীণভাবে একটি পাইপ ব্যবহার করে।
র্যান্ডম 832

@ র্যান্ডম 832 ভাল পয়েন্ট - আমি এটি বিবেচনা করে কিছুটা সম্পাদনা করেছি। বিটিডব্লিউ, আপনি কি জানেন যে কমান্ড সাবস্টিটিউশনে "হুডের নীচে" পাইপের ব্যবহারের উপর নির্ভর করা যেতে পারে? অথবা এটি এমন একটি বাস্তবায়ন বিশদ যা সম্ভাব্যভাবে আলাদাভাবে ভবিষ্যতের সংস্করণ বাশের আলাদা সংস্করণে সম্পন্ন হতে পারে? (অবশ্যই, বাস্তবে, আমি এটি করার সর্বোত্তম
উপায়টি

1
না, এটির নিশ্চয়তা নেই, তাত্ত্বিকভাবে কোনও শেল একটি নামযুক্ত ফিফো বা টেম্প ফাইল ব্যবহার করতে পারে যদিও এর কোনও কারণ নেই।
র্যান্ডম 832

আপনি কি ইতিহাসের প্রসারণ সম্পর্কে নিশ্চিত? কেবলমাত্র অক্ষর যা এটিকে অবরুদ্ধ করতে পারে তা হ'ল ` and '`, এবং আপনার গ্রেপ এক্সপ্রেশনটির চারপাশে একক উদ্ধৃতি ব্যবহার করা হয়েছে।
মুড়ু

1
@ মুরু হ্যাঁ, এটি প্রসারিত হয়েছে। আমিও লক্ষ্য করিনি, তবে আমি এটি পরীক্ষা করে দেখলাম। !সেখানে উদ্ধৃত করা হয় না ', -quotes যেমন '-quotes নিজেদের উদ্ধৃত করা হয়। কমান্ডের জটিলতা তার প্রভাবটিকে ভুল-পূর্বাভাস দেওয়া সহজ করে তোলে, তবে দৃশ্যত বিস্তারের ক্রমের ( !তাড়াতাড়ি) এটি x=foo; echo "'$x'"(-> 'foo') এর মতো কাজ করে শেষ হয় । বাইরের সরানো হচ্ছে "-quotes কারণ হবে !হতে '-quoted এবং ইতিহাস বিস্তার রোধ, কিন্তু তারপর cd যদি ডিরেক্টরির তার নামে হোয়াইটস্পেস হয়েছে ব্যর্থ হবে।
এলিয়াহ কাগন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.