我有一个表达所有内容的表情
local RX=`sed -e 's#.*rx:\(\)#\1#' <<< "${LINE}"`
变量LINE
具有以下内容:
4: uart:PL011 rev3 mmio:0xC006D000 irq:26 tx:435 rx:0 RTS|DTR
我要返回的rx值,在这种情况下为0
现在,它正在重播“ rx:”之后的所有内容
我应该怎么办?
答案 0 :(得分:2)
您可以使用{p>提取rx:
之后的所有数字
RX=`sed -e 's#.*rx:\([0-9]*\).*#\1#' <<< "${LINE}"`
请参见online demo
我在[0-9]*
之间添加了\(\)
以匹配0个或多个数字,并在正则表达式的末尾添加了一个.*
模式以使用其余行,以便在输出中,那么您可能只有第1组中捕获的值。
要匹配除空格以外的任何字符,请将[0-9]
替换为[^[:space:]]
或[^[:blank:]]
甚至是[^ ]
。
答案 1 :(得分:1)
您可以更改为此:
local RX=`sed -e 's#.*rx:\([^ ]*\).*#\1#' <<< "${LINE}"`
但是在这种情况下,如果可以使用GNU grep
,那就更好了:
local RX=`grep -oP 'rx:\K[^ ]*' <<< "${LINE}"`
他们要捕获rx:
之后和空格之前的东西。
答案 2 :(得分:1)
更好的方法:
$ awk -v tag='rx' '{for (i=1;i<=NF;i++){ split($i,t,/:/); f[t[1]]=t[2] } print f[tag]}' <<<"$line"
0
$ awk -v tag='mmio' '{for (i=1;i<=NF;i++){ split($i,t,/:/); f[t[1]]=t[2] } print f[tag]}' <<<"$line"
0xC006D000
$ awk -v tag='uart' '{for (i=1;i<=NF;i++){ split($i,t,/:/); f[t[1]]=t[2] } print f[tag]}' <<<"$line"
PL011
鉴于您可以简单地打印单个或任意多个值。
答案 3 :(得分:1)
请您也可以尝试以下方法。
awk '
match($0,/rx[^ ]*/){
val=substr($0,RSTART,RLENGTH)
sub(/.*:/,"",val)
print val
val=""
}
' Input_file