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/'