2016-03-22 21 views
0

libcom.so drucken müssen, indem Sie 1.0.0 abziehen, wenn es erste Zeile druckt. schneiden Sie die Zeichenfolge mit Zeichenfolge als Trennzeichen in Shell

#!/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 

Fehler, wie cut: the delimiter must be a single character, was ist der beste Weg, dies zu tun?

+0

Hinweis verwenden können Das ist * nicht * ein Bash-Skript. Selbst wenn Ihre Standard-Shell bash ist, bewirkt die Verwendung eines shebang von '#!/Bin/sh', dass bash im * POSIX-Kompatibilitätsmodus * funktioniert, in dem viele Bash-Funktionen nicht verfügbar sind. '#!/usr/bin/env bash' ist ein vernünftiger Standard-Shebang, es sei denn, Sie ziehen es vor, auf einen bestimmten Pfad für bash zu zeigen (eine Lösung, die möglicherweise nicht portierbar ist). – ghoti

Antwort

2

Wenn Sie nur die Zeichenfolge wollen bis zum ersten .so, bash es glücklich für Sie erledigen:

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

Die ${d%%.so*} löscht die längste Zeichenfolge von der rechten Seite %% der variablen d die .so* übereinstimmt. Dies entfernt effektiv alles beginnend mit .so bis zum Ende der Zeichenfolge. Wir fügen dann manuell die .so, die wir entfernt haben, wieder hinzu, weil %% den gesamten übereinstimmenden Teil entfernt, nicht nur den Platzhalter.

Weitere Informationen finden Sie in dieser Anleitung unter parameter expansion.


Alternativ können Sie sed auch verwenden, obwohl es deutlich langsamer sein würde:

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

Haben Sie das von '##' zu '%%' geändert und vergessen, '#' 'im Text zu aktualisieren? –

+0

@BenjaminW. - Nein, ich kann heute einfach nicht gut tippen. :) –

0

Wenn Ihr find Dateinamen als ersten Parameter (s) unterstützt, können Sie

find lib*so* | sed 's/\.so.*/.so/' 
Verwandte Themen