假设我有一个看起来像这两个字符串的字符串:
nvidia-utils-beta 334.16-1
lib32-nvidia-utils-beta 334.16.1-2
我想提取它以便产生:
334.16
334.16.1
...分别
如何?
p.s。我更喜欢非cut|cut
解决方案。
答案 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}