![Использование grep для фильтрации папок с числами](https://rvso.com/image/1618326/%D0%98%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%20grep%20%D0%B4%D0%BB%D1%8F%20%D1%84%D0%B8%D0%BB%D1%8C%D1%82%D1%80%D0%B0%D1%86%D0%B8%D0%B8%20%D0%BF%D0%B0%D0%BF%D0%BE%D0%BA%20%D1%81%20%D1%87%D0%B8%D1%81%D0%BB%D0%B0%D0%BC%D0%B8.png)
Я пытался перечислить только папки с номерами, фильтруя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
еще, и вы получите опыт, который может кардинально изменить вашу карьеру.