输入:adcheck (CentrifyDC 4.4.3-421)
期望的输出结果:4.4.3
我认为可行的方法:
/usr/share/centrifydc/bin/adcheck --version | sed -n '/Centrify DC /,/-/p'
但是这没有输出任何内容吗?
谢谢!
输入:adcheck (CentrifyDC 4.4.3-421)
期望的输出结果:4.4.3
我认为可行的方法:
/usr/share/centrifydc/bin/adcheck --version | sed -n '/Centrify DC /,/-/p'
但是这没有输出任何内容吗?
谢谢!
/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
标志以抑制默认打印。然后,为s///
命令提供一个地址(例如/adcheck (CentrifyDC /
)以确保替换仅发生在与地址匹配的行中。最后,在s///
命令中添加p
标志 - 它将打印替换后的行:$ sed -n '/adcheck (CentrifyDC /s/^.*[^0-9]\([0-9]*\.[0-9]*\.[0-9]*\).*$/\1/p' file
4.4.3
sed 's/[[:alpha:]|(|[:space:]]//g' | awk -F- '{print $1}' <<< "(CentrifyDC 4.4.3-421)"
输出:4.4.3
使用[:space:]
去除额外的空格。
sed
用于去除不需要的字符,awk -F-
表示使用-
作为字段分隔符。
“你认为会成功的”修正版:
/usr/share/centrifydc/bin/adcheck --version | sed 's|.*CentrifyDC \([0-9\.]*\).*|\1|'
输出:
4.4.3
perl -pe '($_)=/([0-9]+([.][0-9]+)+)/' YOURFILE.TXT
perl -nle 'print $v if ($v)=/([0-9]+([.][0-9]+)+)/' YOURFILE.TXT
$> V=$(perl -pe '($_)=/([0-9]+([.][0-9]+)+)/'<<<'adcheck (CentrifyDC 4.4.3-421)')
$> echo "$V"
4.4.3
$> V=$(perl -pe '($_)=/([0-9]+([.][0-9]+)+)/' <<< 'dos2unix-8.2.3-beta.zip')
$> echo "$V"
8.2.3
$> echo 'A2 33. Z-0.1.2.3.4..5' | perl -pe '($_)=/([0-9]+([.][0-9]+)+)/'
0.1.2.3.4
$> gcc --version | perl -pe '($_)=/([0-9]+([.][0-9]+)+)/'
4.7.3
$> bash --version | perl -pe '($_)=/([0-9]+([.][0-9]+)+)/'
4.2.45
$> meld --version | perl -pe '($_)=/([0-9]+([.][0-9]+)+)/'
1.6.1
$> uname -a | perl -pe '($_)=/([0-9]+([.][0-9]+)+)/'
3.8.0
$> perl -pe '($_)=/([0-9]+([.][0-9]+)+)/' /etc/issue
13.04
注意: 第一条命令行提取的版本不包括最后的回车符(我指的是 \n
)。如果这是一个问题,请使用第二个版本或将第一条命令行包装在 echo
中:
$> echo $( perl --version | perl -pe '($_)=/([0-9]+([.][0-9]+)+)/' )
5.14.2
$> 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 尝试不太好。谁知道如何使用 sed
获得与我的 perl
脚本相同的行为?
sed 's/\([0-9][0-9]*[.][0-9][0-9.]*\)/\n\1/'
echo "adcheck (CentrifyDC 4.4.3-421)" | sed -nE "s/.*CentrifyDC (([0-9]+\.[0-9]+\.[0-9]+)-.*).*/\2"/p
(([0-9]+\.[0-9]+\.[0-9]+)-.*)
进行更详细的解释。
外部的圆括号将整个版本分为第一组,例如 4.4.3-421
然后内部的圆括号将连字符(-
)前面的版本分为第二组,例如 4.4.3
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" '
awk
的方法:$ echo "adcheck (CentrifyDC 4.4.3-421)" | awk '{sub(/-.*/,"",$3);print $3}'
4.4.3
...或者可能是cut
的组合:
$ echo "adcheck (CentrifyDC 4.4.3-421)" | cut -d' ' -f3 | cut -d'-' -f1
4.4.3
wget -V|head -n1|sed 's/[[:alpha:]|(|[:space:]]//g' | awk -F- '{print
> $1}'
sed 's/[[:alpha:]([:space:]]//g'
。 - CJ Gaconnetawk
就足够了,不需要像echo | sed | awk
这样复杂的操作。 - fedorqui