grep이 정규 표현식과 일치하는 항목을 찾지 못했습니다.

grep이 정규 표현식과 일치하는 항목을 찾지 못했습니다.

숫자는 0으로 시작할 수 없습니다.

reg ex를 사용하여 이 grep 명령을 실행했습니다.

❯ echo "#time 1m" | grep -E -o "#time\s(?!0)\d{1,2}[m|h|d]"

다음 출력을 얻습니다.

zsh: event not found: 0

그래픽 레지스트리 확장 테스터에서 시도한 결과 일치하는 것으로 나타났습니다.여기에 이미지 설명을 입력하세요.

답변1

zsh: event not found: 0

이는 쉘이 !기록 확장을 트리거로 처리하기 때문입니다. 문자열을 작은따옴표로 묶거나 zsh 또는 Bash에서 set +o histexpand사용 하여 기록 확장을 비활성화합니다. 예를 들어 참조하십시오.setopt nohistexpandset +HBash의 느낌표(!) 이해하기

... grep -E -o "#time\s(?!0)\d{1,2}[m|h|d]"

\s, (?!...)및 는 Perl \d정규식의 일부이며 grep -E사용되는 표준 확장 정규식이 아닙니다. [m|h|d], 또는 중 하나의 단일 문자 와도 일치합니다 . 이렇게 작성하는 것이 더 좋지만, 의미할 수도 있습니다(또는 작성하는 데 더 긴 방법일 뿐입니다).m|hd[mhd|][mhd](m|h|d)

정규식을 표준 ERE로 다시 작성하거나 grep -PGNU grep과 같은 Perl 정규식을 사용할 수 있는 도구로 전환해야 할 수도 있습니다.

바라보다내 정규 표현식이 X에서는 작동하지만 Y에서는 작동하지 않는 이유는 무엇입니까?

답변2

RE와는 아무런 관련이 없습니다. 이를 통해 쉘은 문자열 내부를 확인하고 평가할 수 있습니다. (그래서 오류 메시지가 zsh. 대신 .로 시작됩니다 grep.) 이를 방지하려면 큰따옴표( ') 대신 작은따옴표( ")를 사용하세요.

관련 정보