Як я можу схватитися за струну, яка починається з тире / дефісу?


347

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

Я спробував:

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

Відповіді:


465

Використання:

grep -- -X

Пов'язане: Що означає голий подвійний тире? (завдяки горіхові натти ).


57
для тих, хто цікавиться на цьому етапі, що --означає чи робить: unix.stackexchange.com/questions/11376/…
про natty

2
Також працює з The Silver Searcher (AG).
Zev Eisenberg

Якщо ви хочете використовувати зі змінною, що має пробіли, ви повинні використовувати щось на зразок цього:ARGS="-a -b -c" grep -- "$ARGS"
zapstar

2
@zapstar Або просто, grep -- "--name awesome".
Бретт Відм'єр

@BrettWidmeier, так, я не повинен був використовувати змінну, вона бентежить людей.
запстар

57

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

Тож вам справді потрібно уникнути цього двічі (якщо ви віддаєте перевагу не використовувати інші згадані відповіді). Наступні будуть / повинні працювати

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, незважаючи на те, що говорить керівництво ABS. Bash не обробляє аргументи, починаючи з - інакше, ніж інші. Команда або вбудована в неї Bash згодом буде обробляти аргументи, починаючи з тире, однак це вважає за потрібне. Більшість вбудованих Bash та команд Linux та GNU обробляють - як опціонний термінатор. Використовуйте 'set -x', щоб побачити команди та аргументи, які використовує Bash перед їх виконанням, але після того, як Bash розширив втечі, глобуси та дужки. Греп - заплутаний приклад, тому що він робить власну обробку втечі зворотної косою рисою.
Ной

25

grep -e -X зробить трюк.


1
у мого грепу немає -е, дуже дивно
Майк

14
solaris на програш
Майк

2
Доступно на solaris від / usr / xpg4 / bin / grep, btw. У цьому каталозі багато найповніших утиліт.
pra

Він працював під MinGW ( MinGW не підтримує -P(але це вже інша історія і тут не застосовується)).
Пітер Мортенсен



7

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


5

Правильним способом було б використання "-", щоб зупинити обробку аргументів, як уже згадувалося. Це пов’язано з використанням getopt_long (GNU C-функції від getopt.h) у джерелі інструменту.

Ось чому ви помічаєте ті самі явища в інших інструментах командного рядка; оскільки більшість з них є інструментами GNU і використовують цей виклик, вони проявляють однакову поведінку.

Як бічна примітка - getopt_long - це те, що дає нам крутий вибір між -rlo та --really_long_option та комбінацією аргументів в інтерпретаторі.


3

Якщо ви використовуєте іншу утиліту, яка передає один аргумент grep, ви можете використовувати:

'[-]X'


-1
ls -l | grep "^-"

Сподіваюся, що ця послужила б вашим цілям.


2
Цей вираз охоплює лише рядки, які починаються з тире. Це не відповідає початковому питанню. Він хоче шукати рядок, починаючи з тире, але рядки, які містять цю рядок, не були необхідними, починаються з тире. У початковому питанні рядок, що починається з тире, може знаходитися в будь-якому місці рядка.
Лоран Саймон

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.