Строка --
является специальной для большинства утилит, когда она встречается в командной строке. Он сигнализирует об окончании опций синтаксическому анализатору аргументов командной строки. Он используется в ситуациях, когда вы можете захотеть передать имя файла, начинающееся с тире, например rm -- -f
(, чтобы удалить файл с именем -f
в текущем каталоге ).
Чтобы использовать --
в качестве шаблона с grep
, явно сообщите утилите, что это шаблон:
grep -e --
Опция -e
для grep
принимает аргумент опции, который представляет собой шаблон, по которому вы хотите, чтобы grep
выполнял поиск.
Вы также можете использовать
grep -- --
Здесь grep
знает, что второй --
является шаблоном, потому что первый --
говорит, что это не может быть вариантом.
Ваш последний конвейер возвращает ls -a
, поскольку эта строка в файле не содержит r
. Команда grep -ver
также может быть записана как grep -v -e r
, т. е. «извлечь все строки, не соответствующие(-v
)r
(-e r
)».
Чтобы ответить на вопрос в заголовке, который я интерпретирую как значение :, сообщите о словах с разделителями, -пробелами, которые не начинаются с буквенно-цифрового символа или символа подчеркивания (\w
в некоторых механизмах регулярных выражений ), вы могли бы использовать GNU grep
при условии, что он построен с поддержкой PCRE:
grep -Po '(?<!\S)[^\w\s]\S*'
Это символ, отличный(^
)от слова один(\w
)или пробела один (\s
), при условии, что ему не предшествует((?<!...)
)не -пробел (\S
), а за ним не следует любое число(*
)из не -пробелов(\S
).
Что на ваш ввод возвращает:
-a
--verbose
Упрощенный ответ состоит в том, чтобы сначала «использовать» сигнал конца опций --
, а затем задать шаблон для поиска :
grep -- --
как в:
$ echo $'ls -a\ncmake --verbose\nverbose' | grep -- --
cmake --verbose
Один из вариантов — сигнализировать, что строка --
на самом деле является образцом с-e
$ echo $'ls -a\ncmake --verbose\nverbose' | grep -e --
И наименее элегантное решение — создать регулярное выражение, которое соответствует (только )--
. Это регулярное выражение не может начинаться с --
, поэтому мы должны использовать обходной путь либо:
grep '[-][-]' or grep '[-]\{2\}' or grep -E '[-]{2}'