提取2个字符之间的字符串

时间:2014-02-23 12:36:07

标签: sed awk grep

假设我有一个看起来像这两个字符串的字符串:

nvidia-utils-beta 334.16-1
lib32-nvidia-utils-beta 334.16.1-2

我想提取它以便产生:

334.16
334.16.1

...分别

如何?

p.s。我更喜欢非cut|cut解决方案。

7 个答案:

答案 0 :(得分:5)

当我看到“摘录”时,grep首先出现了:

grep -Po '\S*(?=-\d+$)' file

grep -Po '\s\K[^-]*' file

试验:

kent$  echo "nvidia-utils-beta 334.16-1
lib32-nvidia-utils-beta 334.16.1-2"|grep -Po '\S*(?=-\d+$)'
334.16
334.16.1

kent$  echo "nvidia-utils-beta 334.16-1
lib32-nvidia-utils-beta 334.16.1-2"|grep -Po '\s\K[^-]*'  
334.16
334.16.1

答案 1 :(得分:4)

以下是使用awk

执行此操作的一些方法
awk '{split($NF,a,"-");print a[1]}' file
334.16
334.16.1

它取最后一个字段并用-拆分,然后打印拆分的第一部分。


awk -F" |-" '{print $(NF-1)}' file
334.16
334.16.1

按空格或-划分所有字段,然后打印倒数第二个字段。

答案 2 :(得分:2)

使用sed的可能解决方案:

sed -r 's/.+\s(.+)-.+/\1/' file

例如:

echo "nvidia-utils-beta 334.16-1" | sed -r 's/.+\s(.+)-.+/\1/'
334.16


echo "nvidia-utils-beta 334.16.1-2" | sed -r 's/.+\s(.+)-.+/\1/'
334.16.1

答案 3 :(得分:2)

GNU awk解决方案:

awk '{print gensub(/-[0-9]+/,"","g",$NF)}' file

$ cat file
nvidia-utils-beta 334.16-1
lib32-nvidia-utils-beta 334.16.1-2

$ awk '{print gensub(/-[0-9]+/,"","g",$NF)}' file 
334.16
334.16.1

答案 4 :(得分:2)

使用awk

awk -F '[ -]+' '{ print $(NF-1) }'

使用grep

grep -o '\<[0-9.]\{2,\}'

使用sed

sed -ne 's/.* \(\<[0-9.]\{2,\}\).*/\1/p'

使用perl

perl -ne '/\b([0-9.]{2,})/ && print $1, "\n"'

答案 5 :(得分:2)

bash parameter expansion

while read -r package version; do
    echo "${version%%-*}"
done <<END
nvidia-utils-beta 334.16-1
lib32-nvidia-utils-beta 334.16.1-2
END

答案 6 :(得分:1)

使用awk

awk '{print $2}' file | awk -F - '{print $1}