如何在Shell脚本中解析字符串

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'前面的数字?

6个回答

5
$ first=$(echo $VERSION | cut -d- -f1 | sed 's/\.//g')
$ second=$(echo $VERSION | cut -d- -f2 | cut -d. -f2)

4
$ first=$(echo $VERSION | cut -d- -f1 | tr -d '.')
$ second=$(echo $VERSION | cut -d- -f2 | cut -d. -f2)
$ echo $first
263254
$ echo $second
11

2
tr -d '.' 比我的 sed 用法更好。 - user1907906

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作为变量并设定其值为xxx
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

1

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

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

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


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')

0
$ first=$(echo $VERSION | awk -F"\." '{gsub(/-.*/,"",$4);print $1$2$3$4}')
$ second=$(echo $VERSION | awk -F"\." '{print $5}' )

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接