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

278

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

Я пробовал:

grep "-X"
grep \-X
grep '-X'
Теги:
grep
escaping

10 ответов

368
Лучший ответ

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

grep -- -X

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

  • 27
    -- удобный трюк для ряда утилит Unix.
  • 2
    Работает с ack
Показать ещё 8 комментариев
46

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

grep -e -X выполнит трюк.

Показать ещё 3 комментария
16
grep -- -X
grep \\-X
grep '\-X'
grep "\-X"
grep -e -X
grep [-]X
7

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

  • 0
    Не работает с флагом -F!
5

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

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

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

2

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

'[-]X'
2

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

$ nawk '/-X/{print}' file
0
ls -l | grep "^-"

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

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

grep "^ -X" файл

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

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню