2

У меня есть текстовый файл 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 ответ1

4

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

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

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

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

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

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .