Как вывести часть или число из сопоставления в grep или ack

У меня есть текстовый файл demo.txt как ниже.

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

Файл имеет несколько строк с идентификатором, разбросанным случайным образом. Идентификатор шаблона - это число с круглыми скобками.

Моя работа состоит в том, чтобы найти самый большой идентификатор в этом файле, чтобы я знал, какой будет следующий идентификатор при добавлении новой строки.

Моя предыдущая работа

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

Результат (9) но нет (10) как мое ожидание. Я думаю, что причина в sort рассматривает вывод как текст, потому что они имеют круглые скобки.

Вопрос: как вывести только число из ack или же grep для последующей сортировки, но все еще соответствует шаблону (в моем примере скобки)?

Большое спасибо!

1 ответ

Решение

grep нельзя использовать для вывода частей совпадения, но почему бы не избавиться от скобок?

Это работает для GNU grep:

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

Следующее также работает для BSD grep, который вы можете использовать на OS X, например:

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

Чтобы получить желаемый результат, мы добавляем -n аргумент sort сортировать численно, что дает вам 10 как первый результат.

Другие вопросы по тегам