sed在rx:和[space]之间获取数据的正则表达式

时间:2019-03-04 15:26:56

标签: regex sed

我有一个表达所有内容的表情

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:”之后的所有内容

我应该怎么办?

4 个答案:

答案 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