मेरे पास आउटपुट है VBoxManage list vms
जिससे यह दिखता है:
"arch" {de1a1db2-86c5-43e7-a8de-a0031835f7a7}
"arch2" {92d8513c-f13e-41b5-97e2-2a6b17d47b67}
मैं नाम हड़पने के लिए की जरूरत है arch
और arch2
और उन्हें एक चर में सहेजें।
मेरे पास आउटपुट है VBoxManage list vms
जिससे यह दिखता है:
"arch" {de1a1db2-86c5-43e7-a8de-a0031835f7a7}
"arch2" {92d8513c-f13e-41b5-97e2-2a6b17d47b67}
मैं नाम हड़पने के लिए की जरूरत है arch
और arch2
और उन्हें एक चर में सहेजें।
जवाबों:
यह उन 2 तारों की सामग्री को पार्स करेगा:
$ grep -o '".*"' somefile | sed 's/"//g'
arch
arch2
उपरोक्त पैटर्न से मेल खाते स्ट्रिंग के लिए दिखता है ".*"
। यह डबल कोट्स के भीतर होने वाली किसी भी चीज़ से मेल खाएगा। तो 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
पीसीआरई सुविधा का उपयोग करके आप किसी भी सबस्ट्रिंग की तलाश कर सकते हैं जो एक दोहरे उद्धरण के साथ शुरू होता है या एक दोहरे उद्धरण के साथ समाप्त होता है और केवल प्रतिस्थापन की रिपोर्ट करता है।
/address/
लिए sed
पसंद sed '/^"\(arch[^"]*\)/s//\1/
करते हैं तो आप केवल उस स्ट्रिंग वाले लाइनों पर काम करेंगे।
sed
वास्तव s/^"\([^"]*\)".*/\1/
में सिर्फ ऐसे मामले में होना चाहिए जब लाइन पर केवल दो दोहरे उद्धरण हों।
इसके लिए एक और काम है cut
:
VBoxManage list vms | cut -d \" -f2
cut
प्रत्येक रेखा को परिसीमन के रूप में उद्धरण चिह्न का उपयोग करके फ़ील्ड में विभाजित करता है, फिर फ़ील्ड 2 को आउटपुट करता है: फ़ील्ड 1 पहले उद्धरण से पहले खाली स्ट्रिंग है, फ़ील्ड 2 उद्धरणों के बीच वांछित स्ट्रिंग है, और फ़ील्ड 3 शेष भाग है लाइन।
साथ 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]}"
जब आप चर का उपयोग करने के लिए आते हैं तो यह आसान हो सकता है।
बैश का उपयोग करते हुए, मैं लिखूंगा:
while read vm value; do
case $vm in
'"arch"') arch=$value ;;
'"arch2"') arch2=$value ;;
esac
done < <( VBoxManage list vms )
echo $arch
echo $arch2
और --perl-regexp
विकल्प के साथ grep oneliner के माध्यम से एक ,
VBoxManage list vms | grep -oP '(?<=^\")[^"]*'
स्पष्टीकरण:
(?<=^\")[^"]*
-> यहां एक लुकबाइंड का उपयोग किया जाता है। यह किसी भी वर्ण से मेल खाता है, लेकिन "
शून्य या अधिक बार नहीं (एक बार दोहरे उद्धरण मिल जाने पर, यह मेल खाना बंद कर देता है) जो दोहरे उद्धरण के बाद (केवल पंक्ति जो दोहरे उद्धरणों से शुरू होती है)।
एक और बदसूरत हैक के माध्यम से sed
,
$ sed '/.*\"\(.*\)\".*/ s//\1/g' file
arch
arch2
tr -d \"
उद्धरण हटाने का एक और तरीका है। (tr
आम तौर पर वर्णों के एक सेट का दूसरे में अनुवाद करता है;-d
यह बताता है कि इसके बजाय उन्हें हटा दें।)