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

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

Я пробовал:

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

10 ответов


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

grep -- -X

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


тире-это специальный символ в bash как отметил на http://tldp.org/LDP/abs/html/special-chars.html#DASHREF. Так спасаясь в этот раз просто получает вас мимо Баш, но Греп по-прежнему есть своя цель в тире (с помощью опции).

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

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

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

echo $*

Я призываю его как:

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

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


grep -e -X будет делать трюк.


grep -- -X
grep -- "-X"
grep  \-X
grep  "\-X"
grep -e -X
grep [-]X

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


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

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

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


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

$ nawk '/-X/{print}' file

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

'[-]X'

ls -l | grep "^-"

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


grep "^-X" файл

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