Файл grep только для части строки

У меня есть файл RTF, на котором я использую grep, как это

 grep "Order Number" 'Extract Text Output.rtf'

в результате чего строки выглядят так

\b\fs28 \cf2 Fab Order Number : FAB00772450\

и я хочу, чтобы результат был просто FAB00772450

Я знаю, если я использую -o, он просто вернет слово "Номер заказа", но это мне не поможет

4 ответа

Решение
cat 'Extract Text Output.rtf' | sed -n 's/Order Number : \(.*\)\\/\1/gp'

Выдает именно то, что вы хотите.

Объяснение:

  • sed -n подавить вывод по умолчанию sed
  • s/.../.../g поиск и замена, г: все / глобально
  • Order Number : \(.*\)\\ Ищу "Order Number : "Строка и backslash и сохранить что-либо между группой 1; (Недостатком использования sed является необходимость избежать оператора группировки regex: (...) с \(...\))
  • \1 использовать группу 1 в качестве замены
  • p замена печати, если есть совпадение

Это более гибкий и общий способ, чем использование жестко закодированных групп awk (7 долларов).

Примечание 1: использовать.*? если у вас есть строки, отформатированные так:

 \cf2 Fab Order Number : FAB00772450\ \b \cf2

Это предотвращает жадность регулярных выражений и останавливается на первом обратном слэше. Не проверено, поддерживает ли sed *? и +? операторы, но будем надеяться.

Примечание 2: Если у вас есть несколько частей, которые вы хотите извлечь из строки, используйте несколько групп, и в строке замены вы даже можете переключать их с форматированием, например .../\2 - \1/

Это работает для меня:

grep "Order Number" test.txt | awk {'print $7'} | tr "\\\ " " "

выход:

FAB00772450

Если этот формат всегда соблюдается, но количество токенов не всегда одинаково, вы можете передать его через что-то вроде

sed 's/.*: //' | sed 's#\##'

Это также дает "FAB00772450"

Я бы сказал, что это лучший и более чистый подход, чем любой из предыдущих ответов:

grep -oP 'Order Number :\s*\K[^\r\n]*' 'Extract Text Output.rtf'

или

grep -oP 'Order Number :\s*\K[A-Z0-9]*' 'Extract Text Output.rtf'

  • \Kотбрасывает все, что было сопоставлено до этого момента.
Другие вопросы по тегам