Как разобрать строку в скрипте

Я хочу проанализировать следующую строку в сценарии оболочки.

VERSION=2.6.32.54-0.11.def

Здесь я хочу получить два значения.

first = 263254
second = 11

Я использую следующее, чтобы получить первое значение:

first=`expr substr $VERSION 1 9| sed "s/\.//g" |sed "s/\-//g"`

чтобы получить второе:

second=`expr substr $VERSION 10 6| sed "s/\.//g" |sed "s/\-//g"`

Используя приведенный выше код, получим:

first=263254
second=11

Результат не будет согласованным, если версия будет изменена на:

VERSION=2.6.32.54-0.1.def

Здесь второе значение станет 1d, но я хочу, чтобы он выдавал только 1.

Как я могу напрямую разобрать номер после "-" и до ".d"?

6 ответов

Решение
$ first=$(echo $VERSION | cut -d- -f1 | sed 's/\.//g')
$ second=$(echo $VERSION | cut -d- -f2 | cut -d. -f2)
$ first=$(echo $VERSION | cut -d- -f1 | tr -d '.')
$ second=$(echo $VERSION | cut -d- -f2 | cut -d. -f2)
$ echo $first
263254
$ echo $second
11

Вам не нужно несколько процессов (sed|sed|sed...). один процесс с awk должен работать.

если у вас есть VERSION=xxxx как строка:

чтобы получить первое:

awk -F'[-=]' '{gsub(/\./,"",$2)}$0=$2'

чтобы получить второе:

awk -F'-|\\.def' '{split($2,a,".")}$0=a[2]'

тест:

первый:

kent$  echo "VERSION=2.6.32.54-0.1.def"|awk -F'[-=]' '{gsub(/\./,"",$2)}$0=$2'
263254

второй

kent$  echo "VERSION=2.6.32.54-0.1.def"|awk -F'-|\\.def' '{split($2,a,".")}$0=a[2]'
1

kent$  echo "VERSION=2.6.32.54-0.1234.def"|awk -F'-|\\.def' '{split($2,a,".")}$0=a[2]' 
1234

если у вас есть VERSION=xxx как переменная $VERSION :

first:
awk -F'-' '{gsub(/\./,"",$1)}$0=$1'
second:
awk -F'-|\\.def' '{split($2,a,".")}$0=a[2]'

тест:

VERSION=2.6.32.54-0.1234.def
kent$  echo $VERSION|awk -F'-' '{gsub(/\./,"",$1)}$0=$1'
263254
7pLaptop 11:18:22 /tmp/test
kent$  echo $VERSION|awk -F'-|\\.def' '{split($2,a,".")}$0=a[2]'
1234

Вы должны использовать регулярные выражения вместо количества символов.

first=`sed 's/.//g' | sed 's/\(.*\)-.*/\1/'`
second=`sed 's/.//g' | sed 's/.*-\([0-9]*\).*/\1/'`

\(...\) используются для создания группы захвата, и \1 вывести эту группу.

 first=$(echo ${VERSION} | sed -e 's/^\([^-]*\)-0\.\([0-9]*\)\.def/\1/' -e 's/\.//g')
second=$(echo ${VERSION} | sed -e 's/^\([^-]*\)-0\.\([0-9]*\)\.def/\2/' -e 's/\.//g')
$ first=$(echo $VERSION | awk -F"\." '{gsub(/-.*/,"",$4);print $1$2$3$4}')
$ second=$(echo $VERSION | awk -F"\." '{print $5}' )
Другие вопросы по тегам