정확한 단어를 grep

정확한 단어를 grep

샘플 파일:

t2csi1m9@olth101 [bundleversion_sync]$ cat 1
arun:1.0
arun_kumar:1.2
arun-vinoth:1.3
arun_arun:1.4
t2csi1m9@olth101 [bundleversion_sync]$

t2csi1m9@olth101 [bundleversion_sync]$ grep -w 'arun' 1
arun:1.0
arun-vinoth:1.3
t2csi1m9@olth101 [bundleversion_sync]$

arun파일을 grep하면 12개의 출력이 나오고 첫 번째 출력만 필요합니다. ( arun:1.0).

답변1

예, 두 개의 일치 항목을 얻습니다. 둘 다 단어를 별도의 단어로 arun:1.0포함 하고 단어가 아닌 문자 앞에 끝나며 두 결과 모두( 는 단어 문자로 처리되기 때문입니다 .arun-vinoth:1.3arun:-_arun_kumar:1.2아니요당신의 명령에 따라 돌아오십시오).

이 경우 ^arun:검색 패턴으로 사용하는 것이 더 좋습니다(예: string 으로 시작하는 모든 행) arun:.

답변2

정의단어for는 grep -w일련의 영숫자 또는 밑줄 문자입니다(로케일 또는 ASCII에서만 구현/버전에 따라 검색하는 내용이 단어 문자로 시작하거나 끝나지 않는 경우 동작이 달라집니다).

와 같은 일부 도구를 사용하면 사용자 정의 zsh할 수 있습니다 vim.xterm단어. 그러나 grep내가 아는 한 아무것도 구현되지 않았습니다. 따라서 다른 정의가 필요하다면단어, 다른 방법으로 직접 구현해야 합니다.

예를 들어, 귀하의 경우단어정의는 다음과 같아야 합니다.콜론, 당신은 할 것입니다 :

grep -E '(^|:)arun(:|$)'

( arun( |) 뒤에 줄의 시작 부분( ^) 또는 a :다음에 a :또는 줄의 끝 부분( $)이 옵니다).

또는 표준 기본 정규식을 사용하십시오.

grep '^\(.*:\)\{0,1\}arun\(:.*\)\{0,1\}$'

(줄의 시작( ^), 선택적으로 ( ), \{0,1\}( )로 끝나는 일련의 문자, 선택적으로 ( )로 시작하는 일련의 문자 및 줄의 끝( ))..*:arun:$

또는 PCRE를 사용하십시오(위의 ERE 변형 외에도 PCRE도 지원됨).

grep -P '(?<![^:])arun(?![^:])'

( arun그렇다면앞에는 없어( (?<!...)음수 뒤돌아보기 연산자) 뒤에는 (?!...)( ) 이외의 문자가 올 수 없습니다. with (단어 출력만), (입력에서 오프셋 반환), (단어 강조 표시)도 사용할 수 있습니다.:[^:]grep -ogrep -bgrep --color-w

아니면 당신의단어정의는 정상이어야합니다단어( [[:alnum:]_]) + 하이픈:

grep -E '(^|[^[:alnum:]_-])arun([^[:alnum:]_-]|$)'

등.

관련 정보