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

Dre*_* M. 3 sed

输入: adcheck (CentrifyDC 4.4.3-421)

期望的输出: 4.4.3

我认为会起作用:

/usr/share/centrifydc/bin/adcheck --version | sed -n '/Centrify DC /,/-/p'
Run Code Online (Sandbox Code Playgroud)

但那没什么输出?

谢谢!

Eri*_*tis 5

sed 's/[[:alpha:]|(|[:space:]]//g' | awk -F- '{print $1}' <<< "(CentrifyDC 4.4.3-421)"
Run Code Online (Sandbox Code Playgroud)

输出: 4.4.3

使用[:space:]除去额外的空间.

sed用于删除不需要的字符,并awk -F-表示-用作字段分隔符


bra*_*zzi 5

您的解决方案不起作用,因为您试图使用地址来选择一行,而地址只是选择了一堆行。您的代码/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
Run Code Online (Sandbox Code Playgroud)

在这里,我们将版本号放在一个组中,\([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
Run Code Online (Sandbox Code Playgroud)

在这种情况下,将-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
Run Code Online (Sandbox Code Playgroud)


ssa*_*ota 5

“你认为可行的方法”的更正版本:

/usr/share/centrifydc/bin/adcheck --version | sed 's|.*CentrifyDC \([0-9\.]*\).*|\1|'
Run Code Online (Sandbox Code Playgroud)

输出:

4.4.3
Run Code Online (Sandbox Code Playgroud)