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