Использование grep для фильтрации папок с числами

Использование grep для фильтрации папок с числами

Я пытался перечислить только папки с номерами, фильтруяls -1(опция -1естьперечислить один файл в строке) через grep (я знаю, что find тоже может это сделать, но ради этого примера я хочу придерживаться grep)

Папки есть

PC:test user$ ls -1
1184
36
69929
7
9907

Вот что я получаю с разными выходами...

Вот этот: Я не понимаю, почему там находится 9907, ведь каким-то образом имело смысл, что там должна быть только папка с однозначной цифрой 7?

PC:test user$ ls -1 | grep [0-9]
7
9907

Здесь не хватает цифры 7. .Означает ли это 2 или больше?

PC:test user$ ls -1 | grep [0-9].
1184
36
69929
9907

Означает ли это, что нужно сопоставить все, что содержит число?

PC:test user$ ls -1 | grep [0-9].*
1184
36
69929
7
9907

Когда в кавычках, то работает так, как я и ожидал, так почему? Это эквивалент [0-9].*?

PC:test user$ ls -1 | grep '[0-9]'
1184
36
69929
7
9907

решение1

«подстановка имени файла» или «расширение пути» или «глоббинг»

Когда вы вводите команду, она подвергается нескольким этапам потенциального преобразования.довызывается любая программа (например, grep).

[— специальный символ в некоторых оболочках.

$ echo [0-9]
7

Я думаю, что здесь происходит то, что оболочка расширяет 0-9 как выбор имени файла и находит ваш файл "7" и, следовательно, передает "7" в grep. Поэтому grep ищет имена файлов, которые содержат "7" в любом месте имени файла.

Если вы хотите, [чтобы данные обрабатывались grep, а не оболочкой, вам придется заключить строку в кавычки или заставить оболочку анализировать выражение по-другому.

$ echo [0-9].
[0-9].

Рекомендуется цитирование.

См. также man bash (ищите for), man testи страницу 151этот


обычные выражения

В регулярном выражении .означает "любой одиночный символ". То есть [0-9].означает любую цифру, за которой следует одиночный символ. В имени файла 7последний отсутствует.


Если вы хотите, чтобы grep находил однозначные имена файлов, вам нужно привязать свое выражение как к началу, так и к концу строки.

$ ls -1 | grep '[0-9]'
1184
36
69929
7
9907

$ ls -1 | grep '^[0-9]$'
7

Ой, я сломал свой компьютер.

Небрежное использование специальных символов приводит к разного рода захватывающим результатам.

$ ls -1 > x
$ grep *
x:1184

Это должно стать яснее, если вы примете во внимание

$ ls -1
1184
36
69929
7
9907
x

$ echo *
1184 36 69929 7 9907 x

Теперь просто добавьте к этому еще rmи sudoеще, и вы получите опыт, который может кардинально изменить вашу карьеру.

Связанный контент