2015-06-18 5 views
0

Я работаю над скриптом bash, который будет анализировать полное строковое имя, чтобы предоставить мне значение прошивки. Например оригинальное название строка будет что-то вроде:Parsing String Variable in Bash Script

Example_v0p1 

Желаемая Выход:

0.1 

Первая часть моей функции deliminates строки на основе значения подчеркивания и устанавливает второй элемент массив равен переменной называемой версии:

arr=(`echo $1| tr '_' ' '`) 
version=${arr[1]} 

Используя пример я предоставил, $ версия теперь равна «v0p1». Я ищу способ разобрать эту строку дальше, чтобы она выглядела как желаемый результат.

Если возможно, я хотел бы, чтобы решение могло обрабатывать несколько вариантов одного и того же формата, чтобы я мог использовать один и тот же скрипт для всех кодов версий, которые могут быть сгенерированы. Синтаксис, однако, всегда будет одним и тем же. v # р # {р # р # ....} Примеры:

v0p1p1 
v3p2p0p1 
v1p3 

Желаемый результат:

0.1.1 
3.2.0.1 
1.3 

Я не уверен, что лучший способ приблизиться к этой проблеме. Я недостаточно опытен с помощью REGEX для этого, и я не могу найти подходящий способ разбора строк, потому что они будут различной длины.

ответ

0

Вы можете сделать что-то вроде этого: расширение параметра

s='v3p2p0p1' 
ver=$(sed 's/p/./g' <<< "${s:1}") 

echo "$ver" 
3.2.0.1 

s='v0p1p1' 
ver=$(sed 's/p/./g' <<< "${s:1}") 

echo "$ver" 
0.1.1 
+0

Если вы не возражаете, вы можете объяснить кусок, который говорит '<<<: команда«$ {1} ы»' ' –

+0

<<< word' - это то же самое, что «echo word» command'. – choroba

+0

'<<<' вызывается здесь-string для подачи некоторого значения команде 'sed'. – anubhava

3

Использование:

#!/bin/bash 
for v in v0p1p1 v3p2p0p1 v1p3 ; do 
    v=${v//[vp]/.}    # Replace v's and p's with dots. 
    v=${v#.}     # Remove the leading dot. 
    echo "$v" 
done 
+0

Прошу прощения, если я смутил вас объяснением. То, что вы объявили как «v», на самом деле представляет собой три отдельные строки. Я просто не знал, как показать это в блоке –

+0

@StephenWeaver: для одной строки вы можете пропустить вторую замену. Я обновил ответ. – choroba

+0

Это сработало хорошо, спасибо, что нашли время, чтобы помочь. –

0

Это будет работать:

var="$(echo "v0p1p1" | tr -s 'vp' " .")" 

Он заменяет v с пространством, хотя.

Если вы не хотите, что вы можете сделать:

var=$(echo "v0p1p1" | tr -d 'v' | tr -s 'p' '.')