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'

Odpowiedzi:


465

Posługiwać się:

grep -- -X

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


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ł.


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.


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,



7

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


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.


3

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

'[-]X'


-1
ls -l | grep "^-"

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


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

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.