Bunun VBoxManage list vms
gibi görünen bir çıktım var :
"arch" {de1a1db2-86c5-43e7-a8de-a0031835f7a7}
"arch2" {92d8513c-f13e-41b5-97e2-2a6b17d47b67}
İsimleri kapmak gerekir arch
ve arch2
bir değişkene kaydedin.
Bunun VBoxManage list vms
gibi görünen bir çıktım var :
"arch" {de1a1db2-86c5-43e7-a8de-a0031835f7a7}
"arch2" {92d8513c-f13e-41b5-97e2-2a6b17d47b67}
İsimleri kapmak gerekir arch
ve arch2
bir değişkene kaydedin.
Yanıtlar:
Bu, bu 2 dizenin içeriğini ayrıştırır:
$ grep -o '".*"' somefile | sed 's/"//g'
arch
arch2
Yukarıdaki, kalıpla eşleşen bir dize arar ".*"
. Bu, çift tırnak içinde meydana gelen herhangi bir şeyle eşleşecektir. Bu nedenle grep
bu tür değerleri döndürür:
"arch"
"arch2"
Boru, sed
aradığınız ipleri veren bu iplerden çift tırnak bırakacaktır. Notasyon sed 's/"//g'
, sed
çift tırnak işareti tüm oluşumlarında bir arama yapma ve değiştirme, onları hiçbir şeyle değiştirme talimatıdır s/"//g
. Komut s/find/replace/g
orada olup biten g
ve arama arayışı verilen tüm dizgede global olarak yapmasını söyler.
Ayrıca sed
, başlangıçtaki çift teklifi kesmek, aralarında ne olduğunu tutmak ve kalan teklifi kesmek için kullanabilirsiniz:
$ sed 's/^"\(.*\)".*/\1/' a
arch
arch2
$ grep -o '".*"' somefile | tr -d '"'
arch
arch2
Komut tr
karakterleri silmek için kullanılabilir. Bu durumda çift tırnak işareti siliyor.
$ grep -oP '(?<=").*(?=")' somefile
arch
arch2
grep
PCRE özelliğini kullanarak , çift alıntı ile başlayan ya da çift alıntı ile biten herhangi bir alt dizgeyi arayabilir ve sadece alt dizgiyi rapor edebilirsiniz.
/address/
için sed
gibi sed '/^"\(arch[^"]*\)/s//\1/
yalnızca o dizeyi içeren hatlar üzerinde işlem edeceğiz.
sed
gerçekten farkına vardım s/^"\([^"]*\)".*/\1/
.
Bu başka bir iş için cut
:
VBoxManage list vms | cut -d \" -f2
cut
her satırı satır işaretleyicisini ayırıcı olarak kullanarak alanlara böler, ardından alan 2'yi çıkarır: alan 1, ilk tekliften önce boş dizedir, alan 2, tırnaklar arasında istenen dizedir ve alan 3, geri kalanın kalanıdır hat.
İle sed
Yapabileceğiniz:
var=$(VBoxManage list vms | sed 's/^"\([^"]*\).*/\1/')
Açıklama:
s/.../.../
- eşleştir ve değiştir^
- hattın başında maç\(...\)
- bu bir geri referans, burada daha sonra neyle eşleştirildiğine bakabiliriz. \1
[^"]*
- içermeyen herhangi bir diziyi eşleştirin "
(yani bir sonrakine kadar "
).*
- hattın geri kalanını eşleştir\1
- geri referans ile değiştirinVeya awk
:
var=$(VBoxManage list vms | awk -F\" '{ print $2 }')
Modern mermilerde normal değişken yerine bir dizi de kullanabileceğinizi unutmayın. Gelen bash
yapabileceğiniz:
IFS=$'\n'; set -f
array=( $(VBoxManage list vms | awk -F\" '{ print $2 }') )
echo "array[0] = ${array[0]}"
echo "array[1] = ${array[1]}"
Değişkeni kullanmaya başladığınızda bu daha kolay olabilir.
Bash kullanarak şunu yazarım:
while read vm value; do
case $vm in
'"arch"') arch=$value ;;
'"arch2"') arch2=$value ;;
esac
done < <( VBoxManage list vms )
echo $arch
echo $arch2
Ve --perl-regexp
seçeneği ile grep oneliner aracılığıyla ,
VBoxManage list vms | grep -oP '(?<=^\")[^"]*'
Açıklama:
(?<=^\")[^"]*
-> Burada bir gözbağı kullanılıyor. Herhangi bir karakterle eşleşir, ancak "
sıfır veya daha fazla kez değil (bir çift tırnak bulduktan sonra, eşleşmeyi durdurur), çift tırnaktan hemen sonra olan (yalnızca çift tırnakla başlayan satır).
Başka bir Çirkin kesmek sed
,
$ sed '/.*\"\(.*\)\".*/ s//\1/g' file
arch
arch2
regex açgözlü ve açgözlü olmayan modlara sahip olduğundan, aynı hatta birden fazla hedefiniz varsa, istediğiniz gibi çıkarmazsınız. Hat:
"tom" is a cat, and "jerry" is a mouse.
Hedef:
tom
jerry
Komut (açgözlü modu):
grep -oP '".*"' name
Komut (açgözlü olmayan mod):
grep -oP '".*?"' name
tr -d \"
tırnak işaretleri silmek için başka bir yoldur. (tr
Normalde birbiri içine karakterlerden biri dizi çevirir;-d
sadece yerine silmek için söyler.)