Как я могу найти строку, начинающуюся с тире / дефиса?

347

Я хочу использовать grep для строки, начинающейся с тире / дефиса, как -Xв файле, но это путает это с аргументом командной строки.

Я пробовал:

grep "-X"
grep \-X
grep '-X'
Майк
источник

Ответы:

465

Использование:

grep -- -X

Связанный: Что означает голая двойная черта? (спасибо Натти о Натти ).

newacct
источник
57
для тех из нас, кто интересуется на данном этапе, что --означает или делает: unix.stackexchange.com/questions/11376/…
сумасшедший о natty
2
Работает также с Серебряным Искателем (ag).
Зев Айзенберг
Если вы хотите использовать переменную с пробелами, вы должны использовать что-то вроде этого:ARGS="-a -b -c" grep -- "$ARGS"
zapstar
2
@zapstar Или просто grep -- "--name awesome".
Бретт Видмайер
@BrettWidmeier, да, я не должен был использовать переменную, это сбивает с толку людей.
zapstar
57

Тире - это специальный символ в Bash, как отмечено на http://tldp.org/LDP/abs/html/special-chars.html#DASHREF . Так что избежание этого однажды приведет вас к Bash, но Grep все еще имеет свое значение для штрихов (предоставляя опции).

Так что вам действительно нужно дважды избежать этого (если вы предпочитаете не использовать другие упомянутые ответы). Следующее будет / должно работать

grep \\-X
grep '\-X'
grep "\-X"

Один из способов проверить, как Bash передает аргументы скрипту / программе, - это создать скрипт .sh, который просто повторяет все аргументы. Я использую скрипт с именем echo-args.sh, чтобы время от времени играть с ним:

echo $*

Я призываю это как:

bash echo-args.sh \-X
bash echo-args.sh \\-X
bash echo-args.sh "\-X"

Вы поняли идею.

Чад Горшинг
источник
1
Я не думаю, что это особый персонаж в Bash, несмотря на то, что говорит руководство АБС. Bash не обрабатывает аргументы, начинающиеся с - иначе, чем другие. Команда или встроенная функция, которую впоследствии вызывает Bash, будет обрабатывать аргументы, начинающиеся с дефиса, как сочтет нужным. Большинство встроенных команд Bash и Linux и GNU обрабатывают - как терминатор опций. Используйте 'set -x', чтобы увидеть команды и аргументы, которые Bash использует до того, как они будут выполнены, но после того, как Bash расширил экранирование, глобусы и фигурные скобки. Grep - сбивающий с толку пример, потому что он сам обрабатывает экранирование от обратной косой черты.
Ноа
25

grep -e -X сделает свое дело.

Томас
источник
1
мой grep не имеет -е, очень странно
Майк
14
Солярис для проигрыша
Майк
2
Доступно на солярисе из / usr / xpg4 / bin / grep, кстати. Много более полных утилит в этом каталоге.
пра
Он работал под MinGW ( MinGW не поддерживает -P(но это другая история и здесь не применимо)).
Питер Мортенсен
20
grep -- -X
grep \\-X
grep '\-X'
grep "\-X"
grep -e -X
grep [-]X
Джон Генри
источник
7

У меня нет доступа к машине Solaris, но grep "\-X"у меня работает на Linux.

EZPZ
источник
5

Правильный способ будет использовать «-», чтобы остановить обработку аргументов, как уже упоминалось. Это связано с использованием getopt_long (GNU C-функция из getopt.h) в источнике инструмента.

Вот почему вы замечаете те же явления на других инструментах командной строки; Поскольку большинство из них являются инструментами GNU и используют этот вызов, они демонстрируют то же поведение.

В качестве примечания: getopt_long - это то, что дает нам отличный выбор между -rlo и --really_long_option и комбинацией аргументов в интерпретаторе.

fmmarques
источник
3

Если вы используете другую утилиту, которая передает один аргумент в grep, вы можете использовать:

'[-]X'
Колин В.Х.
источник
2

Вы можете использовать Nawk

$ nawk '/-X/{print}' file
ghostdog74
источник
-1
ls -l | grep "^-"

Надеюсь, что это послужит вашей цели.

XINU
источник
2
Это выражение ловит только строки, начинающиеся с тире. Это не соответствует первоначальному вопросу. Он хочет найти строку, начинающуюся с тире, но строки, содержащие эту строку, необязательно начинаются с тире. В первоначальном вопросе строка, начинающаяся с тире, может находиться где угодно в строке.
Лоран Саймон
-1

grep "^ -X" файл

Он будет grep и выберет все строки из файла. ^ в grep «^» обозначает строку, начинающуюся с

sasank
источник
1
Уже есть ответ, который предполагает, что stackoverflow.com/a/27440348/441757 (опубликовано более года назад)
sideshowbarker
ОП ищет строки, которые начинаются с -строк, а не строк.
codeforester