输入: 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)
但那没什么输出?
谢谢!
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-表示-用作字段分隔符
您的解决方案不起作用,因为您试图使用地址来选择一行,而地址只是选择了一堆行。您的代码/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)
“你认为可行的方法”的更正版本:
/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)