grep минус номер не работает

247
Teejay

Я хочу найти все файлы в каталоге, который содержит -2.

Использование ls | grep "-2"возвратовusage: grep...

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

Насколько я помню, -это не специальный символ регулярного выражения.

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

Использование bash в macOS 10.13

0
Согласен. Странный. Понятия не имею. Но `Ls | grep -e "-2" `будет работать. Просто скажите grep, что это выражение. Кажется, тире читается как опция. Должно быть, трубопровод. Zina 5 лет назад 1
Благодарю. Это как если бы он интерпретировал `-2` как параметр командной строки, независимо от того, что он заключен в кавычки. Teejay 5 лет назад 0
Используйте: `grep - -2` или` grep - "-2" ` Cyrus 5 лет назад 1
[Как использовать grep для поиска шаблона, начинающегося с дефиса (-)?] (Https://askubuntu.com/q/500957/253474), [Как я могу выполнить поиск строки, начинающейся с тире / дефис?] (https://stackoverflow.com/q/2427913/995714), [Сопоставить с grep, когда шаблон находится в переменной и содержит дефис «-»] (https://unix.stackexchange.com/q/388892/ 44425), [grep запутался в именах файлов с тире] (https://unix.stackexchange.com/q/364922/44425) phuclv 5 лет назад 1

1 ответ на вопрос

1
grawity

Это как если бы он интерпретировал -2 как параметр командной строки, независимо от того, что он заключен в кавычки.

grep не знает, заключен ли параметр в кавычки или нет.

Многие шаги синтаксического анализа выполняются самой оболочкой 1 перед тем, как что-либо выполнять вообще - >перенаправления применяются, $переменные раскрываются, *подстановочные знаки расширяются, |конвейеры разбиваются на набор отдельных команд, а каждая команда разбивается на массив слов.

Так ли вы работать grep -2, grep '-2', grep \-2или даже x=-2; grep $x, оболочка все еще видит, как тот же список параметров: { grep, -2}. Это то, что будет передано системному вызову execv (), и это то, что программа grep получит в своем argv[]массиве, независимо от исходного цитирования.


1 Даже в Windows, где командная строка в CreateProcess () представляет собой просто одну строку, большинство портов grep по- прежнему будут иметь такое поведение, поскольку библиотека времени выполнения C выполняет такое же разбиение аргументов во время инициализации.

так `-e` пройдет` `? как это работает, как указано в моем комментарии к ОП Zina 5 лет назад 0
Нет. Это пройдет ``. Но grep знает, что `-e` принимает ровно один параметр, поэтому следующие` -2` будут использоваться как параметр -e, а не как отдельная опция. grawity 5 лет назад 1