Как я могу найти строку, начинающуюся с тире / дефиса? - PullRequest
286 голосов
/ 11 марта 2010

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

Я пробовал:

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

Ответы [ 10 ]

386 голосов
/ 11 марта 2010

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

grep -- -X

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

48 голосов
/ 16 мая 2012

Тире - это специальный символ в 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"

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

24 голосов
/ 11 марта 2010

grep -e -X добьется цели.

17 голосов
/ 19 октября 2014
grep -- -X
grep \\-X
grep '\-X'
grep "\-X"
grep -e -X
grep [-]X
7 голосов
/ 11 марта 2010

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

5 голосов
/ 25 сентября 2013

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

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

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

3 голосов
/ 20 июня 2014

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

'[-]X'
2 голосов
/ 12 марта 2010

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

$ nawk '/-X/{print}' file
0 голосов
/ 02 января 2016

grep "^ -X" file

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

0 голосов
/ 12 декабря 2014
ls -l | grep "^-"

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...