Sed Регулярное выражение, которое получает данные между rx: и [space] - PullRequest
0 голосов
/ 04 марта 2019

У меня есть это выражение, которое принимает все

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 голосов
/ 04 марта 2019

Не могли бы вы попробовать тоже.

awk '
match($0,/rx[^ ]*/){
  val=substr($0,RSTART,RLENGTH)
  sub(/.*:/,"",val)
  print val
  val=""
}
'  Input_file
0 голосов
/ 04 марта 2019

Вы можете изменить это на:

local RX=`sed -e 's#.*rx:\([^ ]*\).*#\1#' <<< "${LINE}"`

Но в этом случае, если вы можете использовать GNU grep, тогда лучше:

local RX=`grep -oP 'rx:\K[^ ]*' <<< "${LINE}"`

Они должны захватывать вещи послеrx: и перед пробелом.

0 голосов
/ 04 марта 2019

Лучший подход:

$ 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

Учитывая, что вы можете просто напечатать отдельные или столько значений, сколько хотите.

0 голосов
/ 04 марта 2019

Вы можете извлечь все цифры после rx:, используя

RX=`sed -e 's#.*rx:\([0-9]*\).*#\1#' <<< "${LINE}"`

См. онлайн-демонстрацию

Я добавил [0-9]* между \(\), чтобы соответствовать 0или более цифр, а также шаблон .* в конце регулярного выражения, чтобы использовать оставшуюся часть строки, чтобы на выходе вы могли получить только значение, захваченное в группе 1.

Для соответствия любомусимволы, отличные от пробелов, заменяют [0-9] на [^[:space:]] или [^[:blank:]], или даже [^ ].

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...