2013-03-01 6 views

Odpowiedz

36
cut -d "=" -f 2 <<< "$your_str" 

lub

sed -e 's#.*=\(\)#\1#' <<< "$your_str" 
+2

Dobry dla prostych przypadkach jednak te metody nie gra dobrze, gdy więcej niż jeden w "=" jest strunowy. Pierwsze rozwiązanie Chepnera jest proste i bardziej niezawodne. – lepe

+1

Jaki jest najsmutniejszy sposób na zrobienie tego? cięte, sed lub inne? – Fabich

3

To powinno działać:

your_str='GenFiltEff=7.092200e-01' 
echo $your_str | cut -d "=" -f2 
2
${word:$(expr index "$word" "="):1} 

że dostaje 7. Zakładając, że masz na myśli całą resztę napisu, po prostu zostaw :1.

8
echo "GenFiltEff=7.092200e-01" | cut -d "=" -f2 
46

Użyj rozszerzenia parametrów, jeśli wartość jest już zapisana w zmiennej.

$ str="GenFiltEff=7.092200e-01" 
$ value=${str#*=} 

Albo użyć read

$ IFS="=" read name value <<< "GenFiltEff=7.092200e-01" 

czy inaczej,

$ echo $value 
7.092200e-01 
+7

Jeśli ciąg ma więcej niż jeden "=": '$ {str ## * =}, aby uzyskać od ostatniego dopasowania. $ {str # * =}, aby uzyskać od pierwszego dopasowania. $ {str %% = *}, aby uzyskać aż do pierwszego dopasowania. $ {str% = *}, aby dostać się do ostatniego meczu. " [String Manipulation @ tldp.org] (http://tldp.org/LDP/abs/html/string-manipulation.html) – lepe

+0

Nie dostałem drugie rozwiązanie do pracy: '$ IFS =" = "odczytaj wartość nazwy <<<" GenFiltEff = 7.092200e-01 "' używając bash 4.4.5 – sn1ckers

+0

Działa dobrze dla mnie w 4.4.5. Jeśli jednak nie możesz rozwiązać problemu, otwórz nowe pytanie, które zawiera wynik, jaki * otrzymasz *. – chepner