Выполнение команды в sed с сохранением непревзойденной части строки - PullRequest
0 голосов
/ 20 июня 2019

Это просто - у меня есть поток данных с IPv4-адресами, закодированными в шестнадцатеричное представление, например, 0c22384e, что означает 12.34.56.78.

Я выяснил команду sed с заменой захваченных октетов на десятичные числа, разделенныепо точке.

echo "0c22384e" | sed -E 's/([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})/printf "%d.%d.%d.%d" 0x\1 0x\2 0x\3 0x\4/eg'

Это работает с одним числом, НО, как только я добавляю текст, который не должен совпадать, он также передается для исполнения - в данном случае через printf.

Как сохранить непревзойденную часть строки, не передавая ее на выполнение?

1 Ответ

0 голосов
/ 21 июня 2019

Имея только один адрес в строке, вы можете использовать

echo "Something 0c22384e more" |
 sed -r 's/(.*)([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})(.*)/"\1" 0x\2 0x\3 0x\4 0x\5 "\6"/' |
 xargs -n6 printf '%s%d.%d.%d.%d%s\n' 

РЕДАКТИРОВАТЬ:
Заменено решение для одной строки и более адресов
с решением для большего количества строк (при условии, что нет \ rв потоке):

echo "Something 0c22384e more 0c22385e
Second line: 0c22386e and 0c223870
Third line: 0c22388e and 0c223890
4th line: 0c2238ae and 0c2238b0" |
  sed 's/$/\r/' |
  sed -r 's/[0-9a-f]{8}/\n&\n/g' |
  sed -r 's/([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})/printf '%d.%d.%d.%d' 0x\1 0x\2 0x\3 0x\4/e' |
  tr -d '\n' |
  tr '\r' '\n'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...