Ciąg wyodrębnienia powłoki skryptu

0
#! /bin/sh
lineversion ="/tmp/g-9.n.gggg1000.fr-worker1.V.2.tar.bz2" 

Moje pytanie: jak mogę wyciągnąć

 g-9.n.gggg1000.fr-worker1.V.2

z

$lineversion 

w innej zmiennej

researcher
źródło

Odpowiedzi:

2
newvar=`echo $lineversion | sed 's/\.tar\.bz2//' | sed 's/\/tmp\///'`

sed to narzędzie „szukaj i zamień” unixa. W powyższym przykładzie jesteśmy s szukanie najpierw „.tar.bz2” (i uciekanie przed kropkami z poprzedzającym ukośnikiem odwrotnym) i zastępowanie go niczym, a następnie pobieranie tego wyjścia i wyszukiwanie „/ tmp /” i zastępowanie go niczym innym.

Ogólnie: sed 's/search_for/replace_with/'

Mahmoud Al-Qudsi
źródło
Możesz zaoszczędzić czas i zasoby, wykonując tylko jedno polecenie sed (i unikaj podwójnego potoku): newvar = echo $lineversion | sed -e 's/\.tar\.bz2//' -e sed 's/\/tmp\///' . Poza tym, brakowało tylnych cytatów (`) wokół polecenia, aby ustawić je w zmiennej.
nex84
Dzięki - naprawiony! Zrezygnowałem z zapamiętywania parametrów sed, ponieważ w przeciwieństwie do grep, jest on zbyt różny na Macu / Linuksie / BSD, abym trzymał się prosto (i używam wszystkich trzech).
Mahmoud Al-Qudsi
2

Możesz użyć składni podciągów, aby wyodrębnić znaki ze stałej pozycji:

echo ${lineversion:position:length}
echo ${lineversion:5:30}

Inną metodą byłoby wycięcie trochę niepotrzebnych znaków:

echo ${lineversion} | cut -d '/' -f3 | sed 's/\.tar\.bz2$//g'
nex84
źródło
1
Dobra odpowiedź, +1 ode mnie! Masz literówkę w swoim początkowym przykładzie (brak dwukropka poprzedzającego pozycję)
Mahmoud Al-Qudsi