Файл 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
подавить вывод по умолчанию seds/.../.../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
отбрасывает все, что было сопоставлено до этого момента.