2012-06-29 27 views

cevap

23

harici aracı kullanmak için bir sebep yok kullanmak yakalamak istiyorsanız bu, küçük harf duyarlı olduğunu unutmayın böyle bunun için sed olarak; bash, içten yapabilir using parameter expansion:

varsa mesela sen sonra is : kısaltmak istediğiniz karakteri:

$ str=foo_bar:baz 
$ echo "${str%%:*}" 
foo_bar 

Açgözlü olmayan açgözlü yollarla hem de yapabilirsiniz:

$ str=foo_bar:baz:qux 
$ echo "${str%:*}" 
foo_bar:baz 
$ echo "${str%%:*}" 
foo_bar 

Özellikle bunu sıkı bir döngü içinde çağırıyorsanız, yeni bir sed işleminin başlatılması, işlemin yazılması, çıktısının okunması ve çıkışının beklenmesi (PID'lerini almak için), tüm yapmanız gereken önemli bir yük olabilir. bash w için iç işleme sahip değilsiniz.


Şimdi - Bunu yapmak isteyen çoğu zaman, ne gerçekten isteyebilirsiniz daha iyi read ile yapılır alanlara bir değişken, bölmektir.

Örneğin

, Diyelim ki /etc/passwd bir çizgi okuyorsanız varsayalım:

line=root:x:0:0:root:/root:/bin/bash 
IFS=: read -r name password_hashed uid gid fullname homedir shell _ <<<"$line" 
echo "$name" # will emit "root" 
echo "$shell" # will emit "/bin/bash" 

bir dosyadan birden fazla satır işlemesini istediğiniz bile, bu çok yalnız bash ile yapılabilir ve harici süreçler:

while read -r; do 
    echo "${REPLY%%:*}" 
done <file 

... herhangi ext gerektirmeden, file her satırından ilk : için her şeyden yayacaktır başlatılacak ernal araçlar.

8

Ne aradığınız gerçekten kolay bir iş:

A spesifik karakterini işaretler
sed 's/A.*//' 

. Birden karakterler

sed 's/[aAbB].*//' 
2

METİN

TEXT=beforexafter 

aşağıdaki gibi, metin içeriyorsa ve belirli karakter

echo "${TEXT%x*}" 

istediğini yapar, sonra x olmak (örneğin) olur.

Bash için "$TEXT" veya "${TEXT}" bütün beforexafter olmakla xafter ucunu kapalı kıyılmış ile "${TEXT%xafter}", sadece before olduğunu. x'u ve onu takip edebilecek her şeyi kesmek için bir tane "${TEXT%x*}" yazıyor.

tesadüfen, aynı zamanda "${TEXT%%x*}" yoktur. Bu, diğerlerinden farklı olarak, birden fazla x varsa farklıdır. son x sadece kapalı doğruyor % ile oysa %% ile Bash, tüm x kapalı doğruyor. Daha uzun olan %%'un daha fazla metni kesmesini gevşek bir şekilde gözlemleyerek bunu hatırlayabilirsiniz.

İsterseniz, elbette, Sed ile aynı şekilde yapabilirsiniz:

echo "$TEXT" | sed 's/x.*//' 
+2

açılımları tırnak koymak Lütfen - 'TEXT'' $ içeriyorsa 'eğer öyleyse echo $ TEXT', dize bölme yapacak 'foo \ t \ tbar \ nbaz', basitçe 'foo bar baz' olarak çıkacak, 'echo' $ TEXT ''bu kusuru göstermiyor. (Çevreyle ilgili olmayan çok değişkenli şeylerin devamlılığı da biraz talihsizdir; en iyi uygulama, ortam değişkenleri ve yerleşik değişkenlerle ad alanı çakışmalarını önlemek için bunları küçük harflerle yapmaktır). –

+0

@CharlesDuffy: Alıntılar hakkında haklısınız: onları atlamak, benim şu andan itibaren reform yapmam gereken kötü bir alışkanlıktır. Tüm-büyük harflerle ilgili olarak, daha ilginç bir açıklama ile ilginç bir nokta yaratırsınız. Kapaklarla ilgili tavsiyenin iyi olduğundan şüpheleniyorum. – thb

+1

Soru değil, ilgili. 'Echo' çalmak için 'echo' $ {TEXT # * x} "' –

İlgili konular