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

843
Billy Chan

У меня есть текстовый файл, 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для последующей сортировки, но при этом сопоставить шаблон (в моем примере скобки)?

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

2
Хм, нет подтверждения в моей системе для тестирования. Это эта программа? http://betterthangrep.com/install/ Hennes 11 лет назад 0
@Hennes, да, это та программа. А в Ubuntu это имя - act-grep. Есть пакет `apt-get install ack-grep`. Я сам нашел, что act более стабилен, чем grep. Billy Chan 11 лет назад 0
@BillyChan: Вы имеете в виду «ack-grep» и «ack», а не «act-grep» и «act». А как ты имеешь ввиду, что ack более стабилен, чем grep? Я автор ack, и я, конечно, не стал бы делать такие заявления. Andy Lester 11 лет назад 0
@AndyLester, спасибо за хорошую работу над `ack`. Я использовал `grep`, но иногда встречал странные ошибки, затем переключался на 'ack`, и такие ошибки исчезали. Поэтому я добавил такую ​​претензию в свои заметки, но действительно не мог вспомнить случаи ошибок. Billy Chan 11 лет назад 0
Ack и grep ведут себя по-разному. Например, ack не будет искать в двоичных файлах, если вы не попросите об этом, поэтому, возможно, ошибки, которые вы получили, были предупреждением о поиске двоичных данных. Andy Lester 11 лет назад 0

1 ответ на вопрос

4
slhck

grep can't be used to output parts of a match, but why not get rid of the parentheses?

This works for GNU grep:

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

The following also work for BSD grep, which you can use on OS X, for example:

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

To get the result we want, we add the -n argument to sort to sort numerically, which gives you 10 as the first result.

Для полноты картины (хотя я предпочитаю установленные пакеты по умолчанию над дополнительными установленными сценариями perl): `./ack-grep demo.txt -o --match '\ (\ d + \)' | sed 's / [()] // g' | сортировать -nr | head -n 1` (используя slhk's sort и sed). Hennes 11 лет назад 1
Да, я решил использовать по умолчанию `grep`, так как не у всех может быть` ack-grep`, но первую команду можно легко заменить, конечно. slhck 11 лет назад 0
slhck, ответ работает отлично. Команда sed такая умная. Большое спасибо! @Hennes, спасибо тебе тоже! Billy Chan 11 лет назад 0

Похожие вопросы