2

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

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

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

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

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

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

3 ответа3

3
cat 'Extract Text Output.rtf' | sed -n 's/Order Number : \(.*\)\\/\1/gp'

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

Объяснение:

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

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

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

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

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

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

2

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

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

выход:

FAB00772450

0

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

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

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .