সেড ব্যবহার করে কীভাবে কেবল ফাইলের নাম পাবেন


17

আমি কীভাবে কেবল ফাইলের নাম সেড ব্যবহার করে পেতে পারি? আমি এই

out_file=$(echo $in_file|sed "s/\(.*\.\).*/\1mp4/g")

তবে আমিও পথটি /root/video.mp4পেয়েছি এবং আমি কেবল চাই video.mp4

উত্তর:


26

basenameজিএনইউ কোর্টিল থেকে আপনি এই কাজটি করতে সহায়তা করতে পারেন:

$ basename /root/video.mp4
video.mp4

আপনি যদি ফাইলটির প্রসারণটি ইতিমধ্যে জানেন তবে এটি মুছে ফেলার জন্য আপনি basenameসিনট্যাক্সটি ব্যবহার করে আবেদন basename NAME [SUFFIX]করতে পারেন:

$ basename /root/video.mp4 .mp4
video

বা অন্য কোনও বিকল্পটি ব্যবহার করে শেষ বিন্দুর পরে সমস্ত কিছু কেটে নেওয়া হবে sed:

$ basename /root/video.old.mp4 | sed 's/\.[^.]*$//'
video.old

3
ব্যবহার sed 's/\.[^.]*$//'আপনার আছে যেমন, জন্য (লুকানো) ব্যর্থ হবে .filenameএবং .এবং ..ডিরেক্টরি
Peter.O

9

সবচেয়ে সহজ সমাধানটি শেষ উপস্থিতি না হওয়া পর্যন্ত সমস্ত কিছু মুছে ফেলা /:

echo /root/video.mp4 | sed 's/.*\///'


5

নিম্নলিখিত যে কোনও উপায় ব্যবহার করুন:

out_file="${in_file##*/}"

out_file="$(basename $in_file)"

out_file="$(echo $in_file | sed 's=.*/==')"

out_file="$(echo $in_file | awk -F"/" '{ print $NF }')"

পুনশ্চ. আপনি একই স্ট্রিংটি পান কারণ আপনার বক্তব্যটিতে \(.*\.\)প্রথম থেকে ডট ( /root/video.) অবধি স্ট্রিংয়ের সাথে মেলে এবং তারপরে আপনি ম্যানুয়ালি যোগ করেন .mp4যা আপনার মূল স্ট্রিংয়ের মতো। s=.*\([^/]*\)=\1=পরিবর্তে আপনার ব্যবহার করা উচিত ।

আপডেট: (প্রথমটি এখন ঠিক করা হয়েছে)

এক্সটেনশন ছাড়াই একমাত্র ফাইলের নাম পেতে আপনি করতে পারেন:

out_file="$(echo $in_file | sed 's=.*/==;s/\.[^.]*$/.new_ext/')"

out_file="$(echo $in_file | sed 's=\([^/]*\)\.[^./]*$=\1.new_ext=')"

out_file="$(echo $in_file | awk -F"/" '{ gsub (/\.[^/.]*$/,".new_ext",$NF);print $NF }'

তবে এই যে কোনও পদ্ধতির সাথে আমি ফর্ম্যাটটি সহ ফাইলের নাম পাই এবং আমাকে কেবল ফাইল নামটি পেতে এবং নিজেই একটি নতুন ফর্ম্যাট স্থাপন করতে হবে।
শিকসনস

আহ, এটা বোঝা যায়। আমি আমার উত্তর আপডেট করেছি।
নলখাগড়া

@ রশ: প্রান্তের মামলাগুলি হবে, যেমন একটি ফাইলের জন্য my.file.tar.gz
donothingsuccessfully

@Donothingsuccessfully সর্বশেষে sedএবং একটি অনুপস্থিত ডট প্রতীক ছিল awk। সংশোধন করা হয়েছে। ধন্যবাদ.
নলখাগড়া

4

রেজেক্স ব্যবহারের অন্যতম মৌলিক বিষয় হ'ল ওয়াইল্ড কার্ড নির্দিষ্ট করার সময় নিদর্শনগুলি প্রকৃতির দ্বারা লোভী হয়। @UloBasEI এর প্রস্তাবিত উত্তর অবশ্যই কার্যকরী উত্তর, এটির জন্য বেসনেম কমান্ডও ব্যবহার করা দরকার। @ শিক্সনসের মূল প্রশ্নটি কেবল সেড ব্যবহার করে সমাধানের জন্য অনুরোধ করে।

চালিয়ে যাওয়ার আগে, শেডের কোন সংস্করণটি লক্ষ্য তা সর্বদা সহায়ক। আমি বিএসডি (OSX এর সাথে চালিত হিসাবে) ধরে নিচ্ছি।

প্রথমত, মূল প্রশ্নে প্রস্তাবিত প্যাটার্নটি কাজ করে না কারণ এটি ইনপুট স্ট্রিংয়ের শুরু থেকে শেষ বিন্দু পর্যন্ত সমস্ত কিছু ক্যাপচার করে। অ্যাঙ্কর ছাড়াই, এই অনুসন্ধানটি বাম থেকে ডানে সমস্ত কিছু গ্রাস করবে। "/ 1" মিলিত প্যাটার্ন, অতএব, শেষ বিন্দু পর্যন্ত এবং সমস্ত কিছুই। এমনকি একাধিক বিন্দু সহ একটি ফাইলের নাম পুরোটা গ্রাস করা হবে। মোটেই কাঙ্ক্ষিত ফলাফল নয়।

প্রথম পদক্ষেপটি নিদর্শনগুলি চিহ্নিত করার জন্য কৌশল স্থাপন করা। এখানে, আপনি ফাইলের বামে সমস্ত কিছু থেকে মুক্তি দিতে চান (আমরা পরে এই এক্সটেনশানটির সাথে ডিল করব):

out_file="$(echo $in_file | sed 's/^\(\/.*\/\)*.*/\1/')"

অনুসন্ধানটি স্ট্রিংয়ের শুরু থেকে মিলছে। এটি "/.*" শূন্য বা তার বেশি বারের একটি প্যাটার্নের সাথে মেলে এবং এরপরে সবকিছু মুছে ফেলা হয়। আমরা "\ 1" দিয়ে মিলিত নিদর্শনগুলি মুদ্রণ করি। আমরা বিশ্বব্যাপী অনুসন্ধান করছি না; আমরা স্ট্রিংয়ের শুরু থেকে অ্যাঙ্করটি নির্দিষ্ট করে অনুসন্ধান করছি।

"-E" বিকল্পটি সক্ষম করে আমরা আরও স্পষ্টতা পেতে পারি যাতে আমাদের প্রথম বন্ধনী এড়াতে হবে না:

out_file="$(echo $in_file | sed -E 's/^(\/.*\/)*.*/\1/')"

সুতরাং এখন আমরা বাম অংশ আছে। আসুন ডানদিকে অংশ যোগ করুন। নোট করুন যে আমাদের বাম অংশটি একটি নিদর্শন হিসাবে রাখা দরকার কারণ আমরা কীভাবে এটি শূন্য বা আরও বেশি বার প্রদর্শিত হবে তা নির্দিষ্ট করতে পারি। আমরা এখন যা করি তা হ'ল ডান অংশের জন্য একটি প্যাটার্ন যুক্ত করা:

out_file="$(echo $in_file | sed -E 's/^(\/.*\/)*(.*)/\2/')"

আমরা কেবলমাত্র দ্বিতীয় ম্যাচটি প্রিন্ট আউট করি, যার ফলে ফাইলের নাম বাদে সমস্ত কিছু বাদ দেওয়া হয়। তবে আমাদের এখনও ফাইলের নাম এক্সটেনশন অপসারণ করতে হবে।

out_file="$(echo $in_file | sed -E 's/^(\/.*\/)*(.*)\..*$/\2/')"

শেষে "$" alচ্ছিক।

অবশেষে, নতুন এক্সটেনশান যুক্ত করতে আপনি ঠিক এর মতো সংশোধন করুন:

out_file="$(echo $in_file | sed -E 's/^(\/.*\/)*(.*)\..*$/\2.mp4/')"

অতিরিক্ত অপ্টিমাইজেশন হ'ল আপেক্ষিক পাথ পরিচালনা করতে প্রথম ফরোয়ার্ড স্ল্যাশ optionচ্ছিক করা:

out_file="$(echo $in_file | sed -E 's/^([\/]?.*\/)*(.*)\..*$/\2.mp4/')"

বেসনামটি প্রতিস্থাপন করার জন্য একটি অলস প্যাটার্ন সন্ধান করার সময় আমি অলস হয়ে এই প্রশ্নটি জুড়ে এসেছি । আমি একটি স্ট্রিপ সিস্টেমে কাজ করছি যে কমান্ডটি ইনস্টল করা নেই।

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