Как вывести часть или число из сопоставления в 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 как первый результат.