ব্যাশ ব্যবহার করে পাথ স্ট্রিংয়ের একটি উপাদান পান


9

আমার কাছে একটি এএসসিআইআই ফাইল রয়েছে যা ফাইলপ্যাথগুলি সহ চালিয়ে আমি পড়েছি:

while read p; do echo $p; done < filelist.txt

ফাইলটিতে নিম্নলিখিত প্যাটার্ন সহ ফাইলপথ রয়েছে:

./first/example1/path
./second/example1/path
./third/example2/path

আমি কীভাবে পাথের স্ট্রিংয়ের একটি নির্দিষ্ট অংশ পেতে পারি ( যেমন /থেকে /), উদাহরণস্বরূপ আমাকে এমন একটি আউটপুট পাওয়া দরকার যা মুদ্রণ করে:

first
second
third

এবং আরো

example1
example1
example2

আমি নিশ্চিত যে নিয়মিত এক্সপ্রেশন ব্যবহার করে এটি করার একটি উপায় আছে এবং sedতবে আমি এর সাথে পরিচিত নই।

উত্তর:


17

ব্যবহার cut:

$ cat filelist.txt
./first/example1/path
./second/example1/path
./third/example2/path

$ cut -d/ -f2 filelist.txt 
first
second
third

$ cut -d/ -f3 filelist.txt 
example1
example1
example2

-d/কলাম বিভেদক সেট করে /এবং -f2নির্বাচন 2nd কলাম।

আপনি অবশ্যই cutকমান্ডের মধ্যে ফাইলের নাম বা পাইপ ডেটার পরিবর্তে বাশ ভেরিয়েবলগুলি ব্যবহার করতে পারেন :

cut -d/ -f3 $MyVariable
echo ./another/example/path | cut -d/ -f3

| cut -d/ -f3 একটি পাইপ ব্যবহার করে কৌশলটি করেছে। ধন্যবাদ! এটি এখন সম্পূর্ণ কমান্ড: while read p; do echo $p; done < filelist.txt | cut -d/ -f3
এমসি এক্সচেঞ্জ

3
@ এমসিএক্সচেঞ্জ লুপের সময় এটি ব্যবহার করার কোনও কারণ নেই। এটি করা এখনই অনেক সহজ cut -d/ -f3 filelist.txt
মন্টি হার্ডার

1
এছাড়াও, সমস্যাগুলি উদ্ধৃত করার সময় এড়ানো এবং ফাইলের নামে নতুন লাইনের সাথে ব্যর্থ হবে না।
ভোলকার সিগেল

10

আপনি এটি আপনার readকমান্ডের মধ্যে সরাসরি IFSচলক যেমন ব্যবহার করতে পারেন do

$ while IFS=/ read -r p1 p2 p3 r; do echo "$p2"; done < filelist.txt 
first
second
third

5

তুমি ব্যবহার করতে পার awk

pilot6@Pilot6:~$ cat filelist.txt
./first/example1/path
./second/example1/path
./third/example2/path

pilot6@Pilot6:~$ awk -F "/" '{print $2}' filelist.txt
first
second
third

pilot6@Pilot6:~$ awk -F "/" '{print $3}' filelist.txt
example1
example1
example2

3

আমরা যদি পথের কোনও উপাদান চাই, তবে এমন কিছু ব্যবহার করা ভাল যা ক্ষেত্রগুলিতে একটি স্ট্রিং ভেঙে দিতে পারে as , ,, বা । যাহোক, প্যাটার্ন প্রতিস্থাপন ব্যবহার করে প্যাটার্ন প্রতিস্থাপন ব্যবহার করে এবং সমস্ত কিছু অ্যারেতে নিক্ষেপ করে।

$> echo ${FILE//\//\ }                                                         
sys class backlight intel_backlight brightness
$> ARRAY=( ${FILE//\//" " } )                                                  
$> echo ${ARRAY[2]}
backlight

$> FILE="./dir1/dir2/file.txt"                                                 
$> ARRAY=( ${FILE//\/" "} )
$> echo ${ARRAY[@]}                                                            
. dir1 dir2 file.txt
$> echo ${ARRAY[1]}
dir1

এখন আমাদের পথের বাইরে তৈরি আইটেমগুলির একটি অ্যারে রয়েছে। মনে রাখবেন যে যদি পাথটিতে ফাঁকা স্থান থাকে, তবে এটি অভ্যন্তরীণ ক্ষেত্র বিভাজককে পরিবর্তন করতে পারে IFS


1

পার্শ cutব্যবহার করে বিকল্প হিসাবে বাশ এবং যাওয়ার উপায়:

perl -F/ -lane 'print(@F[1])' filelist.txt

দ্বিতীয়- /সীমাবদ্ধ ক্ষেত্রের জন্য এবং

perl -F/ -lane 'print(@F[2])' filelist.txt

তৃতীয়- /সীমাবদ্ধ ক্ষেত্রের জন্য।

  • -l: স্বয়ংক্রিয় লাইন-এন্ডিং প্রসেসিং সক্ষম করে। এর দুটি পৃথক প্রভাব রয়েছে। প্রথমে, -n বা -p ব্যবহার করার পরে এটি স্বয়ংক্রিয়ভাবে ps / (ইনপুট রেকর্ড বিভাজক) চম্পস করে। দ্বিতীয়ত, এটি t \ (আউটপুট রেকর্ড বিভাজক )কে অক্টনামের মান রাখার জন্য নির্ধারিত করে যাতে কোনও মুদ্রণ বিবরণীতে সেই বিভাজকটিকে আবার যুক্ত করা যায়। যদি অক্টনাম বাদ দেওয়া হয় তবে $ \ কে বর্তমান মান $ / সেট করে।
  • -a: যখন -n বা -p ব্যবহার করা হয় তখন অটোস্প্লিট মোড চালু করে। @F অ্যারেতে একটি অন্তর্নিহিত স্প্লিট কমান্ডটি অন্তর্নিহিত অভ্যন্তরের মধ্যে প্রথম জিনিস হিসাবে সম্পন্ন করা হয় যখন -n বা -p দ্বারা উত্পাদিত লুপ হয়।
  • -n: পার্লকে আপনার প্রোগ্রামের চারপাশে নিম্নলিখিত লুপটি ধরে নিয়েছে, যা এটি ফাইল-নাম যুক্তিগুলিকে কিছুটা সেড-এন বা অ্যাজকের মাধ্যমে পুনরাবৃত্তি করে তোলে:

    LINE:
      while (<>) {
          ...             # your program goes here
      }
  • -e: প্রোগ্রামের এক লাইনে প্রবেশের জন্য ব্যবহার করা যেতে পারে;

  • print(@F[N]): নবম ক্ষেত্রটি মুদ্রণ করে।
% cat filelist.txt 
./first/example1/path
./second/example1/path
./third/example2/path
% perl -F/ -lane 'print(@F[1])' filelist.txt
first
second
third
% perl -F/ -lane 'print(@F[2])' filelist.txt
example1
example1
example2
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.