2016-03-22 31 views
0

libcom.soを印刷するには、最初の行を印刷するときに1.0.0を取り除いてください。シェルで区切り文字として文字列を使用して文字列を切ります

cut: the delimiter must be a single character、これを行うにいただきました!最良の方法として
#!/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 

エラーアウト?あなただけの最初.soまでの文字列をしたい場合は、bashは喜んであなたのためにそれを処理する

+0

注意を使用することができます。


代わりに、あなたはそれがかなり遅くなりにもかかわらずsedを使用することができますこれは* bashスクリプトではないことです。あなたのデフォルトのシェルがbashであっても、 '#!/ bin/sh'のシバンを使うと、bashが多くのbash関数が利用できない* POSIX互換モード*で動作します。 '#!/ usr/bin/env bash'は、bashの特定のパス(移植可能ではないかもしれない解決策)を指しているのを好まない限り、合理的なデフォルトのシバンです。 – ghoti

答えて

2

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

${d%%.so*}.so*に一致する変数dの右側%%から最長の文字列を削除します。これにより、文字列の最後まで.soで始まるすべてが効果的に削除されます。 %%はワイルドカード部分だけでなく一致部分全体を削除するため、削除した.soを手動で再追加します。

詳しくはparameter expansionを参照してください。

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

これを '##'から '%%'に変更し、本文中の '##'を更新しなかったのですか? –

+0

@ベンジャミンW。 - いいえ、今日はよくタイプできません。 :) –

0

あなたfindは、最初のパラメータ(複数可)としてファイル名をサポートしている場合、あなたは

find lib*so* | sed 's/\.so.*/.so/' 
関連する問題