Как извлечь несколько шестнадцатеричных чисел из строки? - PullRequest
0 голосов
/ 28 мая 2020

У меня есть файл, содержащий эти строки

Entry :  12300000
F Blocks:   0x00000020 0x00000000 0x000a1b00
S Blocks:   0x00100000 0x0000001c 0x00000150

Я хотел бы извлечь только числа, связанные со строкой, начинающейся с F Blocks, в виде строки.

Строку можно легко извлечь используя:

sed -n '/F Blocks:/p' filename

Однако я все еще извлекаю номера строк и проверяю формат с помощью регулярного выражения

blocks="$(sed -n 's/F Blocks:[\t ]\+\([0-9a-f]\+\)[ ]\+\([0-9a-f]\+\)[ ]\+\([0-9a-f]\+\)/0x\1 0x\2 0x\3/p' filename)"

Что не так с данным регулярным выражением?

EDIT1: Обновить F Blocks.. строка.

Ответы [ 2 ]

1 голос
/ 28 мая 2020

При желании вы можете сопоставить (0x)? перед числом, используя sed -E, и группы замены будут 0x\2 0x\4 0x\6/

blocks="$(sed -nE 's/F Blocks:[\t ]+(0x)?([0-9a-f]+)[ ]+(0x)?([0-9a-f]+)[ ]+(0x)?([0-9a-f]+)/0x\2 0x\4 0x\6/p' filename)"

Regex demo | Bash демо

Замена будет выглядеть так:

0x00000020 0x00000000 0x000a1b00
0 голосов
/ 28 мая 2020

Вы также можете сделать это:

grep '^F' input.txt | awk -F':' '
{split($2,numbers, " "); 
  for(ix in numbers) { 
     if(numbers[ix] ~ /0x[0-9]+/){  
         printf("%s ",numbers[ix]) 
     }
  }
}'

И он напечатает:

0x00000000 0x000a1b00

С уважением!

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