#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}'