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

9327
mcgrailm

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

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

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

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

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

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

2
Разве не так же, как этот http://stackoverflow.com/q/974757/422353? 12 лет назад 0
как, черт возьми, этот вопрос не по теме? кто-то, пожалуйста, объясните mcgrailm 12 лет назад 0
Попробуйте передать это в awk, тогда вы можете разделить его и делать с ним все что угодно. user1200129 12 лет назад 0

3 ответа на вопрос

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

Yields exactly what you want.

Explanation:

  • sed -n suppress default output of sed
  • s/.../.../g search and replace, g: everything/globally
  • Order Number : \(.*\)\\ look for "Order Number : " string and a backslash and save anything in between to group 1; (downside of using sed is to have to escape regex's grouping operator: (...) with \(...\) )
  • \1 use group 1 as replacement
  • p print replacement if any match

This is way more flexible and generic than using hard-coded awk groups ($7).

Note 1: use .*? if you have lines formatted like this:

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

This prevents regex from being greedy and stops at the first backslash. Not tested if sed supports *? and +? operators, but let's hope.

Note 2: If you have multiple parts you want to extract from a line, use multiple groups and in the replacement string you can even switch them with formatting, like .../\2 - \1/

2
user1200129

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

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

выход:

FAB00772450

что делает 7? mcgrailm 12 лет назад 0
это печатает 7-ую колонку, я думаю. Он расщепляется на пустое пространство. user1200129 12 лет назад 0
Он печатает 7-е поле. Разделение на то, что FS (по умолчанию для пробела). Scott C Wilson 12 лет назад 1
0
Scott C Wilson

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

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

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

Похожие вопросы