패턴에 하이픈“-”이 포함 된 경우 grep과 일치


11

$ a와 $ b를 일치시키기 위해 다음 명령을 작성했지만 값에 "-"가 포함되면 오류가 발생합니다. 어떻게 피할 수 있습니까?

# a="-Xmx5324m"
# b="-Xmx5324m"
#
#
#  echo "$a"  | grep -Fxc "$b"
grep: conflicting matchers specified

3
grep -Fxc -- "$b" <<< "$a"불필요한 파이프를 피하기 위해 명령 변경을 고려하십시오
h3rrmiller

8
그건 그렇고, 실제로 정규 표현식 일치를 원합니까, 아니면 문자열이 다른 문자열과 같은지 또는 하위 문자열인지 테스트하고 싶습니까? 이 경우 쉘이 내장되어 [[ ... ]]있거나 case더 나은 선택이 될 것입니다. 왜냐하면 당신은 특유의 echo자식 프로세스와 자식 프로세스 를 피하기 때문 입니다.
Uwe

문자열이 같은지 여부는 내 테스트입니다
yael


아무도 나열하지 않은 다른 대안은 인용 된 문자열 내부에서 대시를 이스케이프 처리 할 수 ​​있으므로 grep옵션 시작이 아닌 리터럴 문자로 이해됩니다 . 즉 echo test-test | grep "\-test"알 수없는 -t플래그 에 대해 불평하기보다는 일치 합니다.
Aaron

답변:


20

장소 --당신의 패턴 전에 :

echo "$a"  | grep -Fxc -- "$b"

-- 많은 명령 / 쉘 내장에 대한 명령 옵션의 끝을 지정하고 그 후에 나머지 인수는 위치 인수로 취급합니다.


13

@sebasth의 위대한 대답 외에도 PATTERN을 grep's -e 패턴으로 사용 하는 옵션을 사용하여 PATTERN에 알릴 수 있습니다 (여기에서 <<< zshhere-string 연산자 사용 echo; printf '%s\n' "$a"이식성 참조 ).

grep -Fxc -e "$b" <<<"$a"

또는 다른 옵션 외에.

grep -Fxce "$b" <<<"$a"

목표는 바이트 단위 문자열 동등 비교 이므로 [명령을 대신 사용하십시오 .

if [ "$a" = "$b" ]

또는 $a포함 $b하는 경우 [[...]]ksh 구문을 사용하십시오 .

if [[ $a == *"$b"* ]]

또는 Bourne과 같은 모든 쉘에서 더 이식 가능합니다.

case $a in
  *"$b"*) ...
esac

==[명령의 표준이 아닙니다 . bashism 입니다. =대신 사용하십시오 .
와일드 카드
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.