대시 / 하이픈으로 시작하는 문자열을 어떻게 grep 할 수 있습니까?


347

-X파일에서 와 같이 대시 / 하이픈으로 시작하는 문자열을 grep하고 싶지만 명령 줄 인수로 혼란 스럽습니다.

난 노력 했어:

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

답변:


465

사용하다:

grep -- -X

관련 : 베어 더블 대시 무슨 뜻 무엇? ( natty에 대해 nutty 에게 감사드립니다 ).


57
어떤이 단계에서 궁금 우리의 사람들을 위해 --: 않습니다 수단 또는 unix.stackexchange.com/questions/11376/...
단정에 대해 몰두

2
Silver Searcher (ag)에서도 작동합니다.
Zev Eisenberg

공백이있는 변수와 함께 사용하려면 다음과 같이 사용해야합니다.ARGS="-a -b -c" grep -- "$ARGS"
zapstar

2
@zapstar 아니면 그냥 grep -- "--name awesome".
Brett Widmeier

@BrettWidmeier, 예, 변수를 사용해서는 안되며 사람들을 혼란스럽게합니다.
zapstar

57

대시는 http://tldp.org/LDP/abs/html/special-chars.html#DASHREF에 명시된 Bash의 특수 문자입니다 . 따라서 이것을 한 번 빠져 나가면 Bash를 지나갈 수 있지만 Grep은 여전히 ​​옵션을 제공하여 대시에 대한 고유 한 의미를 갖습니다.

따라서 다른 언급 된 답변을 사용하지 않으려는 경우 실제로 두 번 탈출해야합니다. 다음은 작동해야합니다.

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
나는 생각하지 않습니다-ABS 가이드의 말에도 불구하고 Bash의 특별한 인물입니다. Bash는 다른 것으로 시작하는 인수를 처리하지 않습니다. Bash가 나중에 호출하는 명령 또는 내장 명령은 대시로 시작하는 인수를 처리하지만 적합하다고 생각됩니다. 대부분의 Bash 내장 및 Linux 및 GNU 명령은 옵션 종료 자로 처리합니다. 'set -x'를 사용하여 Bash가 실행되기 전에 Bash가 이스케이프, 글롭 및 중괄호를 확장 한 후 사용하는 명령 및 인수를 확인하십시오. Grep은 백 슬래시 이스케이프 자체 처리를 수행하기 때문에 혼란스러운 예입니다.
Noah Spurrier

25

grep -e -X 트릭을 할 것입니다.


1
내 grep에는 -e, 매우 이상하지 않습니다
Mike

14
패배를위한 solaris
Mike

2
/ twr / xpg4 / bin / grep, btw의 solaris에서 사용 가능합니다. 해당 디렉토리에 더 완전한 유틸리티가 많이 있습니다.
pra

MinGW에서 작동했습니다 ( MinGW 는 지원하지 않습니다 -P(그러나 그것은 다른 이야기이며 여기에 적용되지 않습니다)).
Peter Mortensen


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

7

Solaris 컴퓨터에 액세스 할 수 없지만 grep "\-X"Linux 에서는 작동합니다.


5

올바른 방법은 이미 언급했듯이 "-"를 사용하여 인수 처리를 중지하는 것입니다. 이는 도구 소스에서 getopt_long (getopt.h의 GNU C 기능)을 사용하기 때문입니다.

그렇기 때문에 다른 명령 줄 도구에서도 동일한 현상이 나타납니다. 그것들은 대부분 GNU 도구이고이 호출을 사용하기 때문에 같은 동작을 보입니다.

참고로 getopt_long은 -rlo와 --really_long_option과 인터프리터의 인수 조합 중에서 멋진 선택을 제공합니다.


3

grep에 단일 인수를 전달하는 다른 유틸리티를 사용하는 경우 다음을 사용할 수 있습니다.

'[-]X'

2

당신은 nawk를 사용할 수 있습니다

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

-1
ls -l | grep "^-"

이것이 당신의 목적을 달성하기를 바랍니다.


2
이 표현식은 대시로 시작하는 줄만 잡습니다. 초기 질문을 준수하지 않습니다. 대시로 시작하는 문자열을 검색하려고하지만이 문자열을 포함하는 줄은 대시로 시작할 필요가 없습니다. 처음 질문에서 대시로 시작하는 문자열은 줄의 아무 곳이나 될 수 있습니다.
Laurent Simon

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.