我想在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'之前直接解析数字?
答案 0 :(得分:3)
$ first=$(echo $VERSION | cut -d- -f1 | sed 's/\.//g')
$ second=$(echo $VERSION | cut -d- -f2 | cut -d. -f2)
答案 1 :(得分: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
为变量$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
答案 2 :(得分:2)
$ first=$(echo $VERSION | cut -d- -f1 | tr -d '.')
$ second=$(echo $VERSION | cut -d- -f2 | cut -d. -f2)
$ echo $first
263254
$ echo $second
11
答案 3 :(得分:1)
您应该使用正则表达式而不是字符数。
first=`sed 's/.//g' | sed 's/\(.*\)-.*/\1/'`
second=`sed 's/.//g' | sed 's/.*-\([0-9]*\).*/\1/'`
\(...\)
用于创建捕获组,\1
输出此组。
答案 4 :(得分: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')
答案 5 :(得分:0)
$ first=$(echo $VERSION | awk -F"\." '{gsub(/-.*/,"",$4);print $1$2$3$4}')
$ second=$(echo $VERSION | awk -F"\." '{print $5}' )