Когда я выполняю ls /directory | grep '[^term]'
в Bash, я получаю регулярный список, как будто grep
команда как-то игнорируется. Я пробовал то же самое с egrep
, я пытался использовать это с двойными и одинарными кавычками, но без лучшего результата. Когда я пытаюсь, ls /directory | grep '^[term]
я получаю все записи, начинающиеся с термина - как и ожидалось.
Я опробовал эту команду в онлайн-редакторе, где я могу протестировать свое регулярное выражение, и оно сработало как надо. Но не в Баш. Так что это работает в симуляции, но не в реальной жизни.
Я работаю над Crunchbang Linux 10. Надеюсь, этого достаточно, и я с нетерпением жду каждого намека, потому что неудача в выполнении на таком базовом уровне и потеря времени - это очень печально!
grep
строки, начинающиеся с термина. Или вы хотите использовать grep для строк, не содержащих термин вообще?Ответы:
Вы уверены, что то, что вы хотите, происходит? Когда вы бежите,
ls /directory | grep '[^term]'
вы, по сути, говорите не о буквах ter m. Это означает, что если файл имеет другие буквы в имени, он все равно будет отображаться в выходных данныхls
. Возьмите следующий каталог, например:Теперь, если я бегу,
ls |grep '^[brav]'
я получаю следующее:Как вы можете видеть, не только я ,
brave
иbravo
я тоже получил ,alpha
потому что класс персонажа[]
будет получить любую букву из этого списка.Следовательно, если я запущу,
ls |grep '[^brav]'
я получу все файлы, которые не содержат символов brav нигде в имени.Если вы заметили, что он включал полный список каталогов, потому что все файлы имели хотя бы одну букву, которая не была включена в класс символов.
Поэтому, как сказал Канвуанза, для обратного выражения «термин» вместо символов
t e r m
необходимо использовать этоgrep -v
.Например:
Также, если вы не хотите использовать файлы, которые имеют какие-либо символы в классе
grep -v '[term]'
. Это предотвратит появление файлов, в которых есть любой из этих символов. (Ответ Канвуанзы)Например:
Как вы можете видеть, в списке не было файлов, потому что все файлы в этом каталоге содержали хотя бы одну букву из этого класса.
Приложение:
Я хотел добавить, что с помощью PCRE можно использовать просто регулярное выражение для фильтрации с использованием выражений отрицания. Для этого нужно использовать что - то известное как негативный взгляд вперед регулярное выражение:
(?!<regex>)
.Таким образом, используя приведенный выше пример, вы можете сделать что-то подобное, чтобы получить желаемые результаты без использования
grep
флагов.Чтобы деконструировать это регулярное выражение, оно сначала сопоставляется в начале строки,
^
а затем ищет строки, которые не соответствуютbrav
последующим. Толькоalpha
,charlie
иdelta
матч так что те являются единственными, которые печатаются.источник
-v
вариант. Спасибо за вашу поддержку! Этот вопрос действительно испортил мой день, когда твой ответ осветил мой вечер!negative look-ahead regex
.Я думаю, этот
grep -v
флаг делает то, что вы хотите. Со страницы руководства :Вы можете использовать
ls /directory | grep -v [term]
для печати любых несоответствующих строк.источник
[^abc]
Но я почти уверен, что grep не поддерживает отрицания класса, кроме нескольких стандартных (например[[:^digits:]]
). Поддержка отрицания в Grep ужасна !grep
обработка классов символов просто прекрасна. Это просто означает нечто совершенно иное, чем то, что вы (неправильно) понимаете.[abc]
означает один изa
,b
илиc
;[^abc]
означает что-нибудь, кроме вышесказанного. Это один персонаж.