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:
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.
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.
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
--
oznacza lub robi: unix.stackexchange.com/questions/11376/…ARGS="-a -b -c"
grep -- "$ARGS"
grep -- "--name awesome"
.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ć
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:
Przywołuję to jako:
Masz pomysł.
źródło
grep -e -X
da rade.źródło
-P
(ale to już inna historia i nie ma tu zastosowania)).grep -e '--cut here--' *
wyszukuje wszystkie pasujące linie‘--cut here--’
. Bez -e, grep próbowałby parsować‘--cut here--’
jako listę opcji.źródło
Nie mam dostępu do maszyny Solaris, ale
grep "\-X"
działa dla mnie na systemie Linux.źródło
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.
źródło
Jeśli używasz innego narzędzia, które przekazuje jeden argument do grep, możesz użyć:
źródło
możesz użyć nawk
źródło
Mam nadzieję, że ten spełni twoje zadanie.
źródło
plik grep „^ -X”
Będzie grep i wybierze wszystkie linie z pliku. ^ w grep „^” oznacza linię zaczynającą się od
źródło
-
, a nie linii.