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