sed:从字符串中提取版本号

sed:从字符串中提取版本号,sed,perl,Sed,Perl,输入:adcheck(CentrifyDC 4.4.3-421) 所需输出:4.4.3 我认为有效的方法是: /usr/share/centrifydc/bin/adcheck --version | sed -n '/Centrify DC /,/-/p' /usr/share/centrifydc/bin/adcheck --version | sed 's|.*CentrifyDC \([0-9\.]*\).*|\1|' 但那什么也不输出 谢谢大家! 这里有一个Perl解决方案: ec

输入:
adcheck(CentrifyDC 4.4.3-421)

所需输出:
4.4.3

我认为有效的方法是:

/usr/share/centrifydc/bin/adcheck --version | sed -n '/Centrify DC /,/-/p'
/usr/share/centrifydc/bin/adcheck --version | sed 's|.*CentrifyDC \([0-9\.]*\).*|\1|'
但那什么也不输出


谢谢大家!

这里有一个Perl解决方案:

echo "adcheck (CentrifyDC 4.4.3-421)" | perl -ne 'm/adcheck \(CentrifyDC (.*?)\)/; print "$1\n" '
/usr/share/centrifydc/bin/adcheck --version | perl -ne 'm/adcheck \(CentrifyDC (.*?)\)/; print "$1\n" '

sed的//[:alpha:][:space:][]g'| awk-F-'{print$1}“您的解决方案不起作用,因为您试图使用地址来选择一行的一部分,而地址只是选择一组行。您的代码
/Centrify DC/,/-/p
将打印包含
Centrify DC
的一行和包含
-
的另一行之间的所有行。它在一行内不起作用不过,只是

您需要删除行中的所有内容,但版本号除外。我建议您将版本号分组,并用它替换行中的所有内容:

$ echo "adcheck (CentrifyDC 4.4.3-421)" | sed 's/^.*[^0-9]\([0-9]*\.[0-9]*\.[0-9]*\).*$/\1/'
4.4.3
在这里,我们将版本号放在一个带有
\([0-9]*\.[0-9]*\.[0-9]*\)
的组中,并用该组替换所有行(由
\1
引用)

如果您的输入有多行,则可能需要一些隧道:

$ cat file
adcheck (CentrifyDC 4.4.3-421)
another line
still another line
$ sed 's/^.*[^0-9]\([0-9]*\.[0-9]*\.[0-9]*\).*$/\1/' file
4.4.3
another line
still another line
在这种情况下,将
-n
标志传递给sed以禁止默认打印。然后,为
s//
命令提供一个地址(例如
/adcheck(CentrifyDC/
)为确保替换仅在与地址匹配的行中进行。最后,将
p
标志添加到
s//
命令中-它将在替换后打印该行:

$  sed -n '/adcheck (CentrifyDC /s/^.*[^0-9]\([0-9]*\.[0-9]*\.[0-9]*\).*$/\1/p' file
4.4.3

仅使用
awk
的另一种方法:

$ echo "adcheck (CentrifyDC 4.4.3-421)" | awk '{sub(/-.*/,"",$3);print $3}'
4.4.3
…或者可能是切割的组合:

$ echo "adcheck (CentrifyDC 4.4.3-421)" | cut -d' ' -f3 | cut -d'-' -f1
4.4.3
“您认为有效”的更正版本:

输出:

4.4.3
单行脚本 或稍长一点,但可处理多个版本:

perl -nle 'print $v if ($v)=/([0-9]+([.][0-9]+)+)/' YOURFILE.TXT
使用第一个命令行的示例 不幸的是,如果有多行包含版本号,则这些版本号将连接在一起:

$> echo $(gwenview --version | perl -pe '($_)=/([0-9]+([.][0-9]+)+)/' )
4.8.44.10.54.10.4

为了每行提取一个版本,必须更改单行脚本:

perl -pe 'if(($_)=/([0-9]+([.][0-9]+)+)/){$_.="\n"}'
例如:

$> gwenview --version | perl -pe 'if(($_)=/([0-9]+([.][0-9]+)+)/){$_.="\n"}' 
4.8.4
4.10.5
4.10.4
要仅提取第一个版本号并附加回车符(我是指新行
\n
),我建议:

perl -pe 'if(($v)=/([0-9]+([.][0-9]+)+)/){print"$v\n";exit}$_=""'
例如:

$> gwenview --version | perl -pe 'if(($v)=/([0-9]+([.][0-9]+)+)/){print"$v\n";exit}$_=""'
4.8.4

作为参考,我的尝试没有那么好。谁知道如何使用
sed
获得与我的
perl
脚本相同的行为

sed 's/\([0-9][0-9]*[.][0-9][0-9.]*\)/\n\1/'


如果您认为可以改进这些脚本,请随时发表评论:)

例如,这就可以了

wget-V | head-n1 | sed's/[:alpha:][:space:][]g'| awk-F-'{print $1}'


括号表达式中的管道是不需要的,因为括号表达式意味着“这些字符中的任何一个”。它可能是
sed的/[:alpha:][([:space:][]//g'
每次我们用管道这么多的时候,一只小猫就死了。
echo | sed | awk
太多了,而
awk
一个人可以做到这一点。
$> gwenview --version | perl -pe 'if(($_)=/([0-9]+([.][0-9]+)+)/){$_.="\n"}' 
4.8.4
4.10.5
4.10.4
perl -pe 'if(($v)=/([0-9]+([.][0-9]+)+)/){print"$v\n";exit}$_=""'
$> gwenview --version | perl -pe 'if(($v)=/([0-9]+([.][0-9]+)+)/){print"$v\n";exit}$_=""'
4.8.4
sed 's/\([0-9][0-9]*[.][0-9][0-9.]*\)/\n\1/'