ব্যাশের ভেরিয়েবলের জন্য কেবল একটি স্ট্রিংয়ের অংশ নির্ধারণ করা


11

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

উদাহরণস্বরূপ, পরম পথটি হতে পারে:

/home/myusername/folder1/folder2/folder3

এবং এটি "টার্গেট_পথ" এ সংরক্ষিত হয়েছে এবং আমি চাই "মাইডির" কেবলমাত্র:

/folder1/folder2/folder3

আমি কাট কমান্ডটি বিভিন্ন উপায়ে ব্যবহার করার চেষ্টা করেছি কিন্তু সাফল্য ছাড়াই।


আমন্ত্রণকারী ব্যবহারকারীর /home/usernameআসল $HOMEডিরেক্টরি কি ? যদি তাই হয় তবে আপনি কেবল এটিকে সরিয়ে ফেলতে পারবেন mydir="${target_path#$HOME}"বলে আমি মনে করি
স্টিল্ড্রাইভার

উত্তর:


15

ব্যবহার ব্যাশ এর স্ট্রিং ম্যানিপুলেশন :

$ a=/home/myusername/folder1/folder2/folder3
$ echo "${a#/*/*/}"
folder1/folder2/folder3

সুতরাং, আপনি যে স্ট্রিংটি চান সেটি হবে (শীর্ষস্থানীয় স্ল্যাশ ফিরে যোগ করা):

b="/${a#/*/*/}"

একটি পরিবর্তনশীল জন্য a, ${a#foo}সবচেয়ে কম স্ট্রিং ম্যাচিং সরাবে fooথেকে শুরু এর a। সুতরাং, আমরা /পরম পথের প্রথম দুটি উপাদান অপসারণ করতে, তিনটি (পথের শীর্ষস্থানীয় স্ল্যাশ সহ) সংক্ষিপ্ততম স্ট্রিং সরিয়ে ফেলি ।


পথটি 30 ফোল্ডার হতে পারে এবং আমি কেবল সর্বশেষ 28 টি অন্তর্ভুক্ত করতে চাই this এটি এখনও কাজ করবে?
পাই

@ লাইফফপি না কেন?
মুরু

9

এখানে ব্যবহার করে একটি উদাহরণ দেওয়া হল cut

echo "/home/myusername/folder1/folder2/folder3" | cut -d '/' -f4- 

folder1/folder2/folder3

আপনার যদি নেতৃস্থানীয় প্রয়োজন হয় তবে আপনি আপনার লাইনের শেষে /যুক্ত হতে | sed 's/^/\//'পারেন।

আপনার প্রয়োজন -f4-কারণ ক্ষেত্রগুলির মধ্যে একটি সীমানা হিসাবে ব্যবহার করতে -d '/'বলে । সুতরাং প্রথম ক্ষেত্রটি প্রথম সীমানার আগে আসে, এক্ষেত্রে প্রথম ক্ষেত্রটি খালি। চতুর্থ ক্ষেত্রও তাই এবং চতুর্থ থেকে সমস্ত ক্ষেত্র ব্যবহার করতে বলে।cut/folder1-f4-


7

আপনি বাশ প্যারামিটার সম্প্রসারণটি এর মতো ব্যবহার করতে পারেন:

target_path=/home/username/folder1/folder2/folder3
myvar="/${target_path#/*/*/}"

এর পরে:

echo $myvar

দেয়:

/folder1/folder2/folder3

এটি শেল প্যারামিটার /*/*/এক্সপেনশন ${target_path#pattern}সিনট্যাক্স ব্যবহার করে আপনার টার্গেট_পথ ভেরিয়েবল থেকে প্যাটার্নের প্রথম ম্যাচটি সরিয়ে কাজ করে । দুর্ভাগ্যক্রমে এটি প্রথম /চরিত্রটিকে সরিয়ে দেয় , এ কারণেই মাইভার ভেরিয়েবলটি সেট করার সময় সেই চরিত্রটি স্পষ্টভাবে অন্তর্ভুক্ত করা উচিত।

সতর্কতা: আপনার লক্ষ্য_পথের ভেরিয়েবলটিতে কিছু অক্ষর রয়েছে এবং এটি পরীক্ষা করার আগে আপনার দুটি পথের অংশের চেয়ে বেশি লম্বা হওয়া উচিত। উদাহরণস্বরূপ যদি target_path=/home/username/, তারপর myvar=/। আপনি যদি এমন কিছু চালাচ্ছেন তবে এটি আপনার সিস্টেমের পক্ষে বিপজ্জনক হতে পারে rm -rf "$myvar"*এটি চেষ্টা করবেন না!


পথটি 30 ফোল্ডার হতে পারে এবং আমি কেবল সর্বশেষ 28 টি অন্তর্ভুক্ত করতে চাই this এটি এখনও কাজ করবে?
পাই এর জীবন

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