grep regex 공백 동작


87

다음과 같은 내용이 포함 된 텍스트 파일이 있습니다.

12,34 EUR 
 5,67 EUR
 ...

'EUR'앞에 공백이 하나 있고 0, XX EUR는 무시합니다.

나는 시도했다 :

grep '[1-9][0-9]*,[0-9]\{2\}\sEUR' => didn't match !

grep '[1-9][0-9]*,[0-9]\{2\} EUR' => worked !

grep '[1-9][0-9]*,[0-9]\{2\}\s*EUR' => worked !

grep '[1-9][0-9]*,[0-9]\{2\}\s[E]UR' => worked !

내가 사용하는 수없는 이유를 누군가가, pls는 저를 설명 할 수 \s있지만 \s*\s[E]일치?

운영체제 : Ubuntu 10.04, grep v2.5

답변:


122

이것은 \sgrep 2.5와 최신 버전 (이전 grep의 버그?)을 처리 할 때의 동작 차이처럼 보입니다 . grep 2.5.4로 결과를 확인했지만 grep 2.6.3 (Ubuntu 10.10)을 사용할 때 네 가지 greps 모두 작동합니다.

노트 :

GNU grep 2.5.4
echo "foo bar" | grep "\s"
   (doesn't match)

이므로

GNU grep 2.6.3
echo "foo bar" | grep "\s"
foo bar

아마도 문제가 적을 것입니다 ( \s문서화되지 않음).

Both GNU greps
echo "foo bar" | grep "[[:space:]]"
foo bar

내 조언은 \s... 사용 [ \t]*또는 [[:space:]]또는 이와 유사한 것을 사용하지 않는 것입니다.


24
아니면 그냥 [:space:]예를 들어. 다음과 같이 :cat file | grep "[[:space:]]"
Kiril Kirov

이 버그 요청 mail-archive.com/bug-grep@gnu.org/msg02686.html 에 따르면 최신 버전의 grep (다른 관점)의 버그 인 것 같습니다. 그런데 마지막 문이 왜 일치합니까?
Milde

1
@Milde, 후속 게시물 mail-archive.com/bug-grep@gnu.org/msg02689.html 에서 해당 버그 보고서가 유효하지 않고 종료 된 것으로 표시되었습니다 (따라서 최신 grep의 버그로 간주되지 않음).
Kamal

2
@Milde, 내가 조사한 (이전 또는 새) grep 문서는 실제로 \s전혀 참조하지 않습니다. 나는 그것의 행동이 "정의되지 않음"이라고 말하고 싶다. 대신 [: space :]를 사용하십시오. 이는 이전 및 새 grep에 문서화 된대로 작동합니다.
Kamal

감사합니다. 앞으로 문제를 피하기 위해 [: space :]를 사용할 것입니다
Milde
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.