Назад | Перейти на главную страницу

grep и вкладки: нет совпадений

#cat sample
1   -1  2
2   2   2
2   1-1 3

Мне нужно получить все строки, содержащие отрицательное значение, то есть только 1-ю строку. Значения разделены табуляцией. Сначала я попробовал

# grep "\-1" sample
1   -1  2
2   1-1 3

Но если я попробую

 grep "\t\-1" sample

Я ничего не получаю (нет совпадения). Что я делаю не так?

В Bash это можно сделать:

grep $'\t-1' sample

В $'' заставляет интерпретировать побеги.

Избегать знака минус необязательно.

В основных регулярных выражениях (описанных man 7 regex). Как заметил Георгий Христозов, вы можете использовать Perl-совместимые регулярные выражения, чтобы получить эту возможность. Некоторые реализации grep не будут поддерживать -P, но другие базовые инструменты будут иметь более богатые языки регулярных выражений, вот несколько примеров, которые должны работать:

sed -n '/\t-/p' sample
awk '/\t-/' sample
perl -ne '/\t-/ && print' sample

Чтобы заставить его работать с обычным grep (без использования pcre), вам нужно будет поместить буквальное выражение табуляции в свое регулярное выражение. Во многих оболочках, где клавиша табуляции выполняет что-то вроде завершения, вы можете получить буквальный символ табуляции с помощью Ctrl-v<tab>. чтобы вы набрали:

grep 'Ctrl-v<tab>-' sample

Попробуйте что-нибудь вроде:

grep -P '\t-1' sample

Кстати, предоставленный вами образец имеет отступы табуляции. Вы можете попробовать следующее для сопоставления общих пробелов:

grep -P '\s-1' sample

Проверьте man 7 regex для регулярных выражений POSIX, которые вы можете использовать, а -P поскольку PCRE поддерживается во многих местах, он доступен не везде (и на странице руководства говорится, что он содержит ошибки, поэтому я не всегда ему доверяю), POSIX-файлы должны работать в большем количестве мест.

Вы можете попробовать что-то вроде этого:

grep "^[[:digit:]]\+[[:space:]]\+-"

^ соответствует началу строки.
[[:digit:]]\+ соответствует одной или нескольким цифрам.
[[:space:]]\+ соответствует одному или нескольким пробельным символам.
- наконец соответствует отрицательному значению, которое вы искали.

Страница руководства для регулярного выражения (7): http://linux.die.net/man/7/regex

Дополнительное решение:

Вы также можете использовать awk (и, конечно, другие инструменты). Это пример awk, который печатает строки, в которых второй столбец меньше 0 (отрицательный):

awk '{if ($2 < 0) print}'