Como gerar uma parcial ou um número de um mataching em grep ou ack

2

Eu tenho um arquivo de texto demo.txt como abaixo.

This is a line with id (9)
This (8) is another line with id
(10) This is a line with id too
11 This line does nothing

O arquivo tem algumas linhas com id espalhadas aleatoriamente. O padrão de identificação é um número entre parênteses.

Meu trabalho é encontrar o maior id neste arquivo para que eu saiba qual é o próximo id ao adicionar uma nova linha.

Meu trabalho anterior

ack-grep demo.txt -o --match '\(\d+\)' | sort -r | head -n 1

O resultado é (9) , mas não (10) como minha expectativa. Eu acho que o motivo é sort considera a saída como texto porque eles têm parênteses.

A pergunta é: Como posso produzir apenas o número de ack ou grep para classificação posterior, mas ainda correspondendo ao padrão (parênteses no meu exemplo)?

Muito obrigado!

    
por Billy Chan 17.01.2013 / 13:16

1 resposta

4

grep não pode ser usado para produzir partes de uma correspondência, mas por que não se livrar dos parênteses?

Isso funciona para o GNU grep :

grep -P '\(\d+\)' -o demo.txt | sed 's/[()]//g' | sort -nr | head -n1

O seguinte também funciona para o BSD grep , que você pode usar no OS X, por exemplo:

grep -E '\([[:digit:]]+\)' -o demo.txt | …    
grep -E '\([0-9]+\)' -o demo.txt | …

Para obter o resultado desejado, adicionamos o argumento -n a sort para classificar numericamente, o que lhe dá 10 como o primeiro resultado.

    
por 17.01.2013 / 13:28