我正在尝试运行以下内容:
echo $line | grep "u01/app/[0-9]" | sed -n 's/[0-9]|\./p'
哪里
line="orb 14171 orb 3u REG 253,3 0 14141 /u01/app/11.2.0.4/broa/log/stm1025/agent/"
我想要做的是提取版本号,并将其存储在变量中,但每当我运行上述命令时,我似乎都得到它sed:命令乱码:s/[0-9]p
任何人都知道什么是错的?
答案 0 :(得分:2)
假设你有bash和GNU grep:
version=$(grep -oP '(?<=/u01/app/).+?(?=/)' <<< "$line")
echo "$version" # => 11.2.0.4
该PCRE正则表达式查找/u01/app/
与下一个/
之间的所有字符
答案 1 :(得分:2)
当我运行你的sed命令时,我的sed告诉你:
sed -n 's/[0-9]|\./p'
sed: 1: "s/[0-9]|\./p": unterminated substitute in regular expression
这是因为您没有进行完全替换命令,替换命令具有以下语法:s/…/…/
而您只将其设为s/…/
。
你可以尝试,坚持使用sed:
echo $line | sed -e 's,.*/u01/app/\([0-9\.]*\)*/.*,\1,'
11.2.0.4
答案 2 :(得分:1)
您可以尝试awk
ver=$(awk -F/ '/u01\/app\/[0-9]/ {print $4}' <<< "$line")
echo "$ver"
11.2.0.4
它从变量line
获取第四个字段并将其存储到变量ver
如果变量中只有一行,则可以跳过测试并使用:
ver=$(awk -F/ '{print $4}' <<< "$line")
简单易懂,直接给出价值。没有复杂的正则表达式:)