Jak mogę grep na ciąg, który zaczyna się od myślnika / myślnika?

347

Chcę grep dla ciągu, który zaczyna się od myślnika / myślnika, na przykład -Xw pliku, ale to myli to jako argument wiersza poleceń.

Próbowałem:

grep "-X"
grep \-X
grep '-X'
Mikrofon
źródło

Odpowiedzi:

465

Posługiwać się:

grep -- -X

Powiązane: Co oznacza naga podwójna kreska? (dzięki Nancy o natty ).

newacct
źródło
57
dla tych z nas zastanawiających się na tym etapie, co --oznacza lub robi: unix.stackexchange.com/questions/11376/…
szaleństwo na temat natty
2
Współpracuje również z The Silver Searcher (ag).
Zev Eisenberg,
Jeśli chcesz używać zmiennej ze spacjami, powinieneś użyć czegoś takiego:ARGS="-a -b -c" grep -- "$ARGS"
zapstar
2
@zapstar Lub po prostu grep -- "--name awesome".
Brett Widmeier,
@BrettWidmeier, tak, nie powinienem był używać tej zmiennej, myli ludzi.
zapstar
57

Myślnik jest znakiem specjalnym w Bash, jak zauważono na stronie http://tldp.org/LDP/abs/html/special-chars.html#DASHREF . Tak więc uniknięcie tego raz omija Bash, ale Grep wciąż ma swoje własne znaczenie dla myślników (podając opcje).

Więc naprawdę musisz uciec z niego dwa razy (jeśli wolisz nie używać innych wymienionych odpowiedzi). Następujące będą / powinny działać

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

Jednym ze sposobów sprawdzenia, w jaki sposób Bash przekazuje argumenty do skryptu / programu, jest utworzenie skryptu .sh, który po prostu wyśle ​​echo wszystkich argumentów. Od czasu do czasu używam skryptu o nazwie echo-args.sh, wszystko co zawiera to:

echo $*

Przywołuję to jako:

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

Masz pomysł.

Chad Gorshing
źródło
1
Nie sądzę - jest specjalną postacią w Bash, pomimo tego, co mówi przewodnik ABS. Bash nie przetwarza argumentów zaczynających się od - inaczej niż innych. Polecenie lub wbudowane narzędzie, które następnie wywołuje Bash, będzie obsługiwać argumenty zaczynające się od myślnika, jeśli uzna to za stosowne. Większość wbudowanych Bash oraz poleceń Linux i GNU obsługują - jako terminator opcji. Użyj „set -x”, aby zobaczyć polecenia i argumenty, których używa Bash przed ich wykonaniem, ale po rozwinięciu przez Bash znaków zmiany znaczenia, globów i nawiasów klamrowych. Grep jest mylącym przykładem, ponieważ wykonuje własną obsługę ucieczek odwrotnego ukośnika.
Noah Spurrier
25

grep -e -X da rade.

Tomasz
źródło
1
mój grep nie ma -e, bardzo dziwne
Mike
14
solaris for the lose
Mike
2
Dostępne na solaris od / usr / xpg4 / bin / grep, btw. Wiele bardziej kompletnych narzędzi w tym katalogu.
pra
Działa pod MinGW ( MinGW nie obsługuje -P(ale to już inna historia i nie ma tu zastosowania)).
Peter Mortensen,
20
grep -- -X
grep \\-X
grep '\-X'
grep "\-X"
grep -e -X
grep [-]X
John Henry
źródło
7

Nie mam dostępu do maszyny Solaris, ale grep "\-X"działa dla mnie na systemie Linux.

ezpz
źródło
5

Prawidłowym sposobem byłoby użycie „-”, aby zatrzymać przetwarzanie argumentów, jak już wspomniano. Wynika to z użycia getopt_long (funkcja GNU C z getopt.h) w źródle narzędzia.

Dlatego zauważasz te same zjawiska w innych narzędziach wiersza poleceń; ponieważ większość z nich to narzędzia GNU i używają tego wywołania, zachowują się tak samo.

Na marginesie - getopt_long daje nam fajny wybór między opcjami -rlo i --really_long_option oraz kombinacją argumentów w tłumaczu.

fmmarques
źródło
3

Jeśli używasz innego narzędzia, które przekazuje jeden argument do grep, możesz użyć:

'[-]X'
Colin vH
źródło
2

możesz użyć nawk

$ nawk '/-X/{print}' file
ghostdog74
źródło
-1
ls -l | grep "^-"

Mam nadzieję, że ten spełni twoje zadanie.

XINU
źródło
2
To wyrażenie przechwytuje tylko linie rozpoczynające się od myślnika. Nie jest zgodny z początkowym pytaniem. Chce wyszukać ciąg rozpoczynający się od myślnika, ale wiersze zawierające ten ciąg nie muszą zaczynać się myślnikiem. W początkowym pytaniu ciąg rozpoczynający się od myślnika może znajdować się w dowolnym miejscu linii.
Laurent Simon
-1

plik grep „^ -X”

Będzie grep i wybierze wszystkie linie z pliku. ^ w grep „^” oznacza linię zaczynającą się od

Sasank
źródło
1
Istnieje już odpowiedź, która sugeruje, że stackoverflow.com/a/27440348/441757 (opublikowano ponad rok temu)
sideshowbarker
OP szuka ciągów, które zaczynają się od -, a nie linii.
codeforester