Sed 提取两个字符之间的字符串

Sed 提取两个字符之间的字符串,sed,awk,grep,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解决方案。使用awk: awk '{print $2}' file | awk -F - '{print $1} awk -F '[ -]+' '{ print $(NF-1) }' 使用awk: awk '

假设我有一个字符串,它看起来像以下任意一个:

nvidia-utils-beta 334.16-1
lib32-nvidia-utils-beta 334.16.1-2
我想提取它,这样它就会产生:

334.16
334.16.1
…分别

怎么做

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

使用
awk

awk '{print $2}' file | awk -F - '{print $1}
awk -F '[ -]+' '{ print $(NF-1) }'
使用
awk

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

以下是使用
awk

awk '{split($NF,a,"-");print a[1]}' file
334.16
334.16.1
它取最后一个字段,用
-
将其拆分,然后打印拆分的第一部分



将所有字段按空格或
-
分隔,然后打印最后一个字段。

以下是使用
awk

awk '{split($NF,a,"-");print a[1]}' file
334.16
334.16.1
它取最后一个字段,用
-
将其拆分,然后打印拆分的第一部分


这将所有字段按空格或
-
划分,然后打印最后一个字段。

当我看到“提取”时,grep首先出现:

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

测试:

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

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

测试:


使用
sed的可能解决方案

sed -r 's/.+\s(.+)-.+/\1/' file
sed -ne 's/.* \(\<[0-9.]\{2,\}\).*/\1/p'
例如:

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

使用
sed的可能解决方案

sed -r 's/.+\s(.+)-.+/\1/' file
sed -ne 's/.* \(\<[0-9.]\{2,\}\).*/\1/p'
例如:

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

A
GNU awk
解决方案:

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

A
GNU awk
解决方案:

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

使用
awk

awk '{print $2}' file | awk -F - '{print $1}
awk -F '[ -]+' '{ print $(NF-1) }'
使用
grep

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

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

使用
awk

awk '{print $2}' file | awk -F - '{print $1}
awk -F '[ -]+' '{ print $(NF-1) }'
使用
grep

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

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

whileread-r包版本;做
回显“${version%%-*}”
完成bash

whileread-r包版本;做
回显“${version%%-*}”

这是一个有效的解决方案,所以我不会投反对票,但你刚刚让阿霍、温伯格和克尼汉哭了@jaypal,我不会投票支持两个awk命令解决方案。Vanda,无论如何,这是一个很好的尝试。这是一个有效的解决方案,所以我不会投反对票,但你刚刚让aho,weinberger和kernighan哭了@jaypal,我不会投票支持两个awk命令解决方案。Vanda,无论如何,这是一个很好的尝试。
grep-Po'\s\K[^-]*'
似乎是迄今为止最紧凑的一个。
grep-Po'\s\K[^-]*'
似乎是迄今为止最紧凑的一个。