grep para apenas parte da linha

2

Eu tenho um arquivo rtf que estou usando grep como este

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

que resulta em linhas semelhantes a esta

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

e quero que o resultado seja apenas FAB00772450

Eu sei que se eu usar -o só retornará a palavra "Número da Ordem", mas isso não me ajuda

    
por mcgrailm 23.03.2012 / 03:28

3 respostas

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

Produz exatamente o que você quer.

Explicação:

  • sed -n suprime a saída padrão do sed
  • s/.../.../g procura e substitui, g: tudo / globalmente
  • Order Number : \(.*\)\ procura " Order Number : " string e backslash e salva qualquer coisa entre o grupo 1; (desvantagem de usar o sed é ter que escapar do operador de agrupamento do regex: (...) com \(...\) )
  • usa o grupo 1 como substituto
  • p substituição de impressão se houver correspondência

Isso é muito mais flexível e genérico do que usar grupos awk codificados ($ 7).

Nota 1: use. *? se você tem linhas formatadas assim:

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

Isso evita que a regex seja gananciosa e pare na primeira barra invertida. Não testado se o sed suporta *? e + operadores, mas vamos esperar.

Nota 2: Se você tiver várias partes que deseja extrair de uma linha, use vários grupos e, na sequência de substituição, você poderá até alterná-los com a formatação, como .../ - /

    
por 18.09.2012 / 15:59
2

Isso funciona para mim:

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

saída:

FAB00772450

    
por 23.03.2012 / 03:44
0

Se esse formato for sempre seguido, mas o número de tokens nem sempre for o mesmo, você poderá enviá-lo por meio de algo como

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

Isso também produz "FAB00772450"

    
por 24.03.2012 / 21:20