4

我想在 shell 脚本中解析以下字符串。

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”之前的数字?

4

6 回答 6

4
$ first=$(echo $VERSION | cut -d- -f1 | sed 's/\.//g')
$ second=$(echo $VERSION | cut -d- -f2 | cut -d. -f2)
于 2013-07-30T09:12:01.967 回答
3

您不需要多个进程 (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=xxxas 变量$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
于 2013-07-30T09:13:37.910 回答
3
$ first=$(echo $VERSION | cut -d- -f1 | tr -d '.')
$ second=$(echo $VERSION | cut -d- -f2 | cut -d. -f2)
$ echo $first
263254
$ echo $second
11
于 2013-07-30T09:29:57.630 回答
1

您应该使用正则表达式而不是字符数。

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

\(...\)用于创建捕获组,并\1输出该组。

于 2013-07-30T09:11:51.083 回答
0
 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')
于 2013-07-30T09:16:41.173 回答
0
$ first=$(echo $VERSION | awk -F"\." '{gsub(/-.*/,"",$4);print $1$2$3$4}')
$ second=$(echo $VERSION | awk -F"\." '{print $5}' )
于 2013-07-30T09:18:40.800 回答