কমান্ডের আউটপুট থেকে উদ্ধৃত স্ট্রিংয়ের সামগ্রী কীভাবে নিষ্কাশন করব?


26

আমার আউটপুট রয়েছে VBoxManage list vmsযা থেকে এটির মতো দেখাচ্ছে:

"arch" {de1a1db2-86c5-43e7-a8de-a0031835f7a7}   
"arch2" {92d8513c-f13e-41b5-97e2-2a6b17d47b67}  

আমি নাম দখল করতে প্রয়োজন archএবং arch2তাদের একটি পরিবর্তনশীল মধ্যে সংরক্ষণ করুন।

উত্তর:


34

গ্রেপ + সেড ব্যবহার করে

এটি সেই দুটি স্ট্রিংয়ের বিষয়বস্তু বিশ্লেষণ করবে:

$ grep -o '".*"' somefile | sed 's/"//g'
arch
arch2

উপরেরটি প্যাটার্নটির সাথে মিলে যাওয়া স্ট্রিংয়ের সন্ধান করে ".*"। এটি ডাবল উদ্ধৃতিতে ঘটে যাওয়া যে কোনও কিছুতেই মিলবে will সুতরাং grepএই ধরণের মানগুলি ফিরে আসবে:

"arch"
"arch2"

পাইপটি আপনি sedযে স্ট্রিংগুলি সন্ধান করছেন তাতে এই স্ট্রিংগুলি থেকে যে কোনও ডাবল উদ্ধৃতি সরিয়ে ফেলবে। স্বরলিপিটি অনুসন্ধানের sed 's/"//g'নির্দেশ sedদিচ্ছে এবং ডাবল উদ্ধৃতিগুলির সমস্ত উপস্থিতি প্রতিস্থাপন করার জন্য, সেগুলিকে কিছুই না করে প্রতিস্থাপন করে s/"//g,। কমান্ডটি s/find/replace/gসেখানে কী চলছে, এবং gঅনুসন্ধানের পিছনে এটি প্রদত্ত পুরো স্ট্রিংয়ে এটি বিশ্বব্যাপী এটি করতে বলে।

শুধু সেড ব্যবহার

আপনি sedপ্রারম্ভিক দ্বিগুণ উদ্ধৃতিটি কেটে ফেলতে পারেন , তাদের মধ্যে যা রয়েছে তা রাখুন এবং অবশিষ্ট উদ্ধৃতি + সমস্ত কিছু কেটে ফেলুন:

$ sed 's/^"\(.*\)".*/\1/' a
arch
arch2

অন্যান্য পদ্ধতি

$ grep -o '".*"' somefile | tr -d '"'
arch
arch2

কমান্ডটি trঅক্ষর মুছতে ব্যবহার করা যেতে পারে। এই ক্ষেত্রে এটি ডাবল উদ্ধৃতি মুছে ফেলছে।

$ grep -oP '(?<=").*(?=")' somefile
arch
arch2

grepপিসিআরই বৈশিষ্ট্যটি ব্যবহার করে আপনি যে কোনও সাবস্ট্রিংগুলি সন্ধান করতে পারেন যা ডাবল উদ্ধৃতি দিয়ে শুরু হয় বা ডাবল উদ্ধৃতি দিয়ে শেষ হয় এবং কেবল মাত্র স্ট্রিংয়ের প্রতিবেদন করতে পারে।


1
tr -d \"উদ্ধৃতি মুছার অন্য উপায়। ( trসাধারণত অক্ষরের একটি -d
সেটটিকে অন্যটিতে

1
SLM - আপনি একটি অ্যাড যদি /address/করতে sedমত sed '/^"\(arch[^"]*\)/s//\1/আপনি শুধু তাই স্ট্রিং সম্বলিত লাইন চালনা করব।
মাইকজারভেজ

1
@ মাইকজার্ভ - সত্য, আউটপুটটিতে আর্চ কতটা ধারাবাহিক হতে চলেছে তা নিশ্চিত ছিল না। তবে যদি তা হয় তবে তাও কার্যকর হবে।
slm

1
ভাল পয়েন্ট এসএমএল। ধারাবাহিক হবে এমন কোনও ইঙ্গিত নেই। দুঃখিত।
মাইকজারভেজ

2
আমি ঠিক বুঝতে পেরেছি যে লাইনটিতে কেবল দুটি ডাবল-কোট থাকলে আপনার sedসত্যিকারের করা উচিত s/^"\([^"]*\)".*/\1/
মাইকজারভেজ

19

এটি অন্য কাজ cut:

VBoxManage list vms | cut -d \" -f2

3
খুব ঝরঝরে! এটি কীভাবে কাজ করে: cutপ্রতিটি রেখাকে ডিলিমিটার হিসাবে উদ্ধৃতি চিহ্ন ব্যবহার করে ক্ষেত্রগুলিতে বিভক্ত করে, ক্ষেত্র 2 আউটপুট করে: ক্ষেত্র 1 প্রথম উক্তির আগে খালি স্ট্রিং, ক্ষেত্র 2 হ'ল উদ্ধৃতিগুলির মধ্যে ওয়ান্ট স্ট্রিং, এবং ক্ষেত্র 3 বাকীটি লাইন।
ডেলটাব

7

আপনি যা sedকরতে পারেন তা সহ:

var=$(VBoxManage list vms | sed 's/^"\([^"]*\).*/\1/')

ব্যাখ্যা:

  • s/.../.../ - ম্যাচ এবং প্রতিস্থাপন
  • ^- লাইনের শুরুতে ম্যাচ করুন
  • \(...\) - এটি একটি পিছনের রেফারেন্স, আমরা পরে এখানে কী মিলছে তা উল্লেখ করতে পারি \1
  • [^"]*- এমন কোনও অনুক্রমের সাথে মিল রাখুন যাতে একটি নেই "(যেমন পরবর্তী পর্যন্ত ")
  • .* - বাকী লাইনের সাথে মেলে
  • \1 - পিছনের রেফারেন্স দিয়ে প্রতিস্থাপন করুন

বা এর সাথে awk:

var=$(VBoxManage list vms | awk -F\" '{ print $2 }')

নোট করুন যে আধুনিক শেলগুলিতে আপনি সাধারণ ভেরিয়েবলের পরিবর্তে একটি অ্যারেও ব্যবহার করতে পারেন। ইন bashআপনি কি করতে পারেন:

IFS=$'\n'; set -f
array=( $(VBoxManage list vms | awk -F\" '{ print $2 }') )
echo "array[0] = ${array[0]}"
echo "array[1] = ${array[1]}"

আপনি যখন ভেরিয়েবলটি ব্যবহার করতে আসেন তখন এটি আরও সহজ হতে পারে।


আপনি কি দয়া করে আমার জন্য এই সেড কমান্ডটি ভঙ্গ করবেন?
হ্যারিস কাভান


5

এবং --perl-regexpবিকল্প সহ গ্রেপ অনিলাইনারের মাধ্যমে একটি ,

VBoxManage list vms | grep -oP '(?<=^\")[^"]*'

ব্যাখ্যা:

(?<=^\")[^"]*-> একটি লুকবিহিন্ড এখানে ব্যবহৃত হয়। এটি "শূন্য বা তার বেশি বার নয় এমন কোনও অক্ষরের সাথে মেলে (একবার এটি একটি ডাবল কোটস খুঁজে পেলে এটি মিলে যায় s

অন্য কুশলী হ্যাক মাধ্যমে sed,

$ sed '/.*\"\(.*\)\".*/ s//\1/g' file
arch
arch2

0

যেহেতু রেজেক্সের লোভী এবং অ-লোভী পদ্ধতি রয়েছে, যদি একই লাইনে আপনার একাধিক লক্ষ্য থাকে তবে এটি আপনার ইচ্ছামত নিষ্কাশন করবে না। লাইন:

"tom" is a cat, and "jerry" is a mouse. 

টার্গেট:

tom
jerry

আদেশ (লোভী মোড):

grep -oP '".*"' name

আদেশ (লোভী মোড):

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