2016-03-25 23 views
0

Ben şu dizeyi içeren bir değişken Sağlar ki (aralarında boşluk ama yankılandı zaman çizgiler gibi görünüyor):Dizgede belirli satırları silinsin mi? Kabuk

animal:whale 
animal:dog 
animal:2_mice 
animal:cat 

Ve ben silmek istediğiniz hayvanların adlarını içeren başka bir değişken var boşluklarla ayrılmış ilk dize.

Diyelim names="cat dog"

Ben ilk dizesinden kedi ve köpek içeren satırları silme hakkında gitmek nasıl

?

Sed ve grep yaklaşımlarına bakmayı denedim, ancak şu ana kadar çalışacak herhangi bir bilgi bulamadım.

Ayrıca, ifadenin tam olarak eşleşmesi gerektiğine de dikkat etmeliyim, eğer ikinci değişken kedi yerine sadece ca içeriyorsa, kedi silinmemelidir. grep ters aramayı kullanma

+0

isimleri ayrılmış, virgülle veya boşluk olması normal mi? – Alec

+0

Uzay. Ad değişkeninin içeriği, her biri boş alanla ayrılmış birden fazla hayvanın adlarını içerebilir. – Daeto

+1

Değişkeninizin tam değeri nedir? "Printf" ifadesini gösterebilir% q \ n "" $ var "' çıktı – anubhava

cevap

1
echo "$variable" | grep -Ev ":($(echo "$names" | sed 's/ /|/g'))$" 
+1

'echo $ variable 'yeni satırları (boşluklarla değiştirerek) atar. –

+0

Bu hile yapmış gibi görünüyor! :) Yeni satırdaki şeyin gerçekten önemli olmadığını sanıyorum, ama -P mümkün olabildiğince çok evrensel çözüm tercih ettiğim için bir problem olabilir. – Daeto

+1

Taşınabilirlik için -E'ye geçti ve her şeyle tam olarak eşleşmesi için destek eklendi: – Alec

0

, isimler değişken değerler alan ayrılır varsayar ve tek kelime her:

$ echo "$var" 
animal:whale 
animal:dog 
animal:2_mice 
animal:cat 

$ echo "$names" 
cat dog 

$ echo "$var" | grep -v $(printf ' -e :%s$' $names) 
animal:whale 
animal:2_mice 
İlgili konular