কমান্ড থেকে প্রতিটি আউটপুট লাইনে উপসর্গ এবং প্রত্যয় স্ট্রিং


17

আমি বাশ স্ক্রিপ্ট লেখার চেষ্টা করে একটি সমস্যায় পড়েছি। grepআউটপুটগুলি যখন আসে তখন এটি অনেকগুলি লাইনে ফিরে আসে। আমি এই আউটপুট লাইনের প্রতিটিটিতে একটি স্ট্রিং উপসর্গ এবং প্রত্যয় যুক্ত করতে চাই।

আমিও নোট যে আমি বংশীধ্বনিতুল্য করছি চাই lsমধ্যে grepমত:

ls | grep

2
আপনার পার্স করা উচিত নয় ls- এটি খারাপ জুজু। এছাড়াও, এটি হতে হবে grep? এবং আপনি কিছু উদাহরণ আউটপুট দিতে পারেন?
সোবারিক

1
যদি ফাইলের নামটিতে একটি নতুন লাইন থাকে তবে আপনি আপনার স্ক্রিপ্টটি কী করতে চান?
তাই ভাইনিকা

উত্তর:



5

সাথে sed:

ls | grep pattern | sed -e 's/^/prefix/' -e 's/$/suffix/'

তবে মনে রাখবেন, লাইন ফিডগুলির ফাইল ফাইলগুলির সমস্যা এবং পার্সিংয়ের যাবতীয় সমস্যা রয়েছে lsযা সাধারণত খারাপ ধারণা।

পার্ল সহ

perl -e 'print "prefix".$_."suffix\n" for grep { m/somepattern/} glob "*"'

দ্রষ্টব্য - পার্ল কমান্ডের grepমতো একটি প্যাটার্ন নিতে পারে grepতবে আপনি ফাইল পরীক্ষা প্রয়োগের মতো কাজও করতে পারেন।

যেমন

grep {-d} glob "*" #filters directories.
grep { (stat)[9] > time() - 60 } glob "*" #reads file mtime and compares. 

grepডিফল্টর মধ্যে পুনরাবৃত্তি $_বর্তমান উপাদান মানকে সেট করা হয়, সুতরাং আপনি sed/ grepস্টাইল রেজেক্স প্রয়োগ করতে পারেন , বা ভিত্তিক বিভিন্ন কার্য সম্পাদন করতে পারেন $_


´sed´ ব্যবহার করে আপনার প্রথম উদাহরণে আমি প্রত্যয় / উপসর্গ হিসাবে কোনও পরিবর্তনকে কীভাবে অন্তর্ভুক্ত করব?
স্পেশালবম্ব

উদ্ধৃতিগুলি পরিবর্তন করুন এবং কেবল ইম ব্যবহার করুন।
সোবারিক

2

এক্ষেত্রে জিএনইউ findআপনাকে পাইপ এবং সম্ভাব্য সমস্যাজনক পার্সিংকে বাদ দিয়ে এই সমস্ত কাজ একসাথে করতে দেয় ls:

find . -maxdepth 1 -name '[^.]*' \
  -regextype posix-extended -regex "MYPATTERN" \
  -printf 'SOMEPREFIX %f SOMESUFFIX\n'

( findঅবশ্যই অন্যান্য কমান্ডের আউটপুটটিকে নির্বিচারে পরিবর্তন করার ভাল উপায় নয়!)

কিছু নোট:

  • -maxdepth 1এবং -name [^.]*নামের সাথে মিলে যাওয়া কাজটিকে সমতল ls(বা ls .) এর মতো করে তোলে । আপনি যে কোনও শেল-স্টাইল গ্লোব ব্যবহার করতে পারেন তবে নোট করুন যে "*" একটি শীর্ষস্থানীয়ের সাথে মিলবে "। একটি নামে অসদৃশ bash, তাই [^.]*কিছু মানে নেই একটি নেতৃস্থানীয় "।"
  • MYPATTERN হ'ল যথাযথ পসিক্স পূর্ব (ডিফল্ট টাইপটি ইমাকস, এখানে দেখুন ) তবে এটি অবশ্যই পুরো ফাইলের সাথে মেলে তাই .*thing.*কেবল পরিবর্তে এর মতো কিছু ব্যবহার করুনthing
  • আপনি সম্ভবত দুজনের পরিবর্তে -name/ এর মধ্যে একটি ব্যবহার করতে পারেন -regex(উদাঃ -রেজেক্স "[^।]। মাইপ্যাটার্ন। "
  • -printfসমর্থন জিনিষ প্রচুর , %nঅনলঙ্কৃত ফাইল অথবা ডাইরেক্টরি নাম

(এটি আপনার সংস্করণটির উপর নির্ভর করতে পারে find, আপনার ম্যান পৃষ্ঠার "স্ট্যান্ডার্ডস কনফারেন্স" বিভাগটি পরীক্ষা করুন)

প্রয়োজনীয় কোন বহিরাগত প্রোগ্রাম সঙ্গে একটি সম্ভাব্য বিকল্প হিসেবে bashরয়েছে compgenযা অন্যান্য বিষয়ের মধ্যে, একটি থেকে globs, সমতুল্য বিস্তৃতি lsকোন বিকল্প সহ:

compgen -P "someprefix>" -S "<somesuffix" -G "pattern"

এটি নিউলাইনগুলি সহ সাদা জায়গা সহ ফাইলের নামগুলি পরিচালনা করে। compgen -G "*"সমতল হিসাবে একই আউটপুট সরবরাহ করা উচিত ls(তবে মনে রাখবেন যে ls *এটি সম্পূর্ণ আলাদা জিনিস different আপনার এখনও প্রয়োজন হবে grep, এবং এটি সমস্যা সমাধান করতে পারে বা নাও পারে, তবে এটি উল্লেখ করার মতো।


0

sedএবং findসমাধানগুলিকে চ্যালেঞ্জ জানানো হয় যদি আপনার উপসর্গ / প্রত্যয়টিতে রিজেক্স কী অক্ষর অন্তর্ভুক্ত থাকে বা যদি পরিবেশের পরিবর্তনশীল (তাত্ক্ষণিক মানের পরিবর্তে) পাস করতে চান তবে xargs+ echoএখানে আরও উপযুক্ত হতে পারে।

পরিবেশ পরিবর্তনশীল সহ:

ls | grep p | xargs -I % sh -c "echo $PATH/%"

একটি ইনলাইন সহ:

ls | grep p | xargs -I % sh -c "echo `pwd`/%"
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.