2016-03-22 16 views
0

'de sınırlayıcı olarak dize kullanarak dize kesme İlk satırı yazdırdığında 1.0.0 sıyrılarak libcom.so yazdırmanız gerekir. En iyi yolu bu ne yapmalı cut: the delimiter must be a single character olarakKabuğu

#!/bin/sh 
data=$(sed '0,/^__VERSION__$/d' "$0") 
for d in $data 
do 
    echo with version: 
    echo $d 
    echo "with no version" 
    d1="$(cut -d\.so -f1 <<< $d)" 
    #Need to save it in a variable for further processing 
    echo $d1 
done 

exit 

__VERSION__ 
libcom.so.1.0.0 
libclock.so.1.0.0 
libstdc++.so.6.0.20 
libxml.so.2.7.8 
libmi.so.1.0.0 
librt.so.6.6.5 
libcsapi.so.1.0.0 

hata dışarı? Sadece ilk .so kadar dizeyi istiyorsanız

+0

Not kullanabilirsiniz: o ölçüde daha yavaş olacağını rağmen


Alternatif olarak, sed kullanabilirsiniz Bu bir * bash betik değil. Varsayılan kabuğunuz bash olsa bile, '#!/Bin/sh' bir shebang kullanarak bash, birçok bash fonksiyonunun mevcut olmadığı * POSIX uyumluluk modunda * çalışmasına neden olur. bash için belirli bir yola (taşınabilir olmayan bir çözüm) işaret etmeyi tercih etmediğiniz sürece, # #/usr/bin/env bash 'makul bir varsayılan shebang'dır. – ghoti

cevap

2

, bash mutlu sizin için idare edecek:

d1="${d%%.so*}.so" 

${d%%.so*}.so* maçları değişken d sağ tarafında %% gelen en uzun dize siler. Bu, dize sonuna kadar .so ile başlayan her şeyi etkili bir şekilde kaldırır. Daha sonra kaldırdığımız .so'u elle yeniden ekledik çünkü %% sadece joker porsiyonunu değil, tüm eşleşen kısmı kaldırır.

Daha fazla ayrıntı için bu kılavuzu parameter expansion'a bakın.

d1=$(sed 's/\(\.so\).*$/\1/' <<< $d) 
+0

Bunu '##' ile '%%' arasında değiştirdiniz mi ve metinde '##' güncellemeyi mi unuttunuz? –

+0

@BenjaminW. - Hayır, bugün iyi yazamam. :) –

0

sizin find dosya desteklediğinde ilk parametre (ler) gibi, sen

find lib*so* | sed 's/\.so.*/.so/' 
İlgili konular