我有这一行:
102:20620453:d=2017021012:UGRD:10 m above ground:15 hour fcst::lon=79.500000,lat=9.000000,val=-5.35
现在我想从这一行打印值-5.35而不是别的。
我也希望这个命令能够从这一行中提取-7.04而不是其他内容。
102:20620453:d=2017021012:UGRD:10 m above ground:15 hour fcst::lon=280.500000,lat=11.000000,val=-7.04
我已经阅读了其他堆栈溢出问题,他们似乎没有完全了解我正在寻找的东西。我注意到他们你做了awk或sed。在val =?
之后,我应该做些什么类型的事情才能提取上述行的一部分答案 0 :(得分:2)
不需要awk
,sed
或任何其他外部工具:bash有自己的内置正则表达式支持,通过=~
运算符[[ ]]
,以及BASH_REMATCH
数组(填充了匹配的内容)。
val_re='[, ]val=([^ ]+)'
line='102:20620453:d=2017021012:UGRD:10 m above ground:15 hour fcst::lon=79.500000,lat=9.000000,val=-5.35'
[[ $line =~ $val_re ]] && echo "${BASH_REMATCH[1]}"
也就是说,如果你真的希望删除所有字符串val=
并将其包括在内,那么如果将来其他值添加到格式中则会导致代码中断),你也可以这样做:
val=${line##*val=} # assign everything from $line after the last instance of "val=" to val
此处的语法为parameter expansion。另请参阅BashFAQ #100: How do I do string manipulations in bash?
答案 1 :(得分:1)
您可以将awk与字段分隔符一起用作=
并打印最后一个字段:
awk -F'=' '{print $NF}' <<< "$str"
-5.35
答案 2 :(得分:0)
这将从末尾搜索字符串val =并在此之后给出任何内容
str='102:20620453:d=2017021012:UGRD:10 m above ground:15 hour fcst::lon=79.500000,lat=9.000000,val=-5.35'
echo "$str" | grep -Po '(?<=val=).*'
回答仅适用于GNU grep