grep-файл тільки для частини рядка


2

У мене є rtf файл, який я використовую grep на такий

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

це призводить до появи рядків, які виглядають так

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

і я хочу, щоб результат був просто FAB00772450

Я знаю, якщо я використовую -o це просто поверне слово "номер замовлення", але це не допомагає мені



як, чорт візьми, це питання поза темою? хтось, будь ласка, поясніть
mcgrailm

Спробуйте пов'язувати це з awk, після чого ви можете розділити його і зробити все, що вам подобається.
user1200129

Відповіді:


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

Виходить саме те, що ви хочете.

Пояснення:

  • sed -n припиняє вихідний типовий параметр sed
  • s/.../.../g пошук і заміна, g: все / глобально
  • Order Number : \(.*\)\\ шукати " Order Number : "рядок і a 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


що робить 7?
mcgrailm

вона друкує 7-й стовпчик, я думаю. Він розбивається на пробіл.
user1200129

1
Друкується 7-е поле. Розділення відбувається на будь-якому FS (за промовчанням у просторі).
Scott C Wilson

0

Якщо цей формат завжди виконується, але кількість маркерів не завжди однакове, можна провести його через щось подібне

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

Це також дає "FAB00772450"

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.