Grep 패턴과 다음 단어

Grep 패턴과 다음 단어

다음과 같은 줄이 포함된 텍스트 파일이 있습니다(마지막 두 문자열만 중요함).

1 sometext Pattern
2 sometext Pattern  5Asda5}  
3 sometext Pattern asd2-asd  
4 sometext Pattern a-d
5 sometext Pattern   foobar  
6 sometext Pattern {asd  
7 Pattern Pattern something 123asd  
8 Pattern sometext asd    
9 Pattern 5h{1,2}b

마지막 단어로 "Pattern"이 있는 모든 줄을 찾아야 합니다. 이 경우 단어는 문자와 하이픈이 포함된 문자열로 정의됩니다. 문자열 뒤에 선행 공백이 있을 수 있습니다(예: Pattern\t\t\t\t\t$).

이에 대한 나의 견해는 다음과 같다

egrep  '(\bPattern\b +[^a-zA-Z\-]{2,} *$)|(\bPattern\b *$)' file.txt 

뒤에 공백이 오는 패턴이 있는 모든 줄과 끝에 "단어"가 아닌 패턴이나 패턴이 있는 줄을 찾습니다. 그러나 첫 번째 부분은 예상대로 작동하지 않습니다. 단어가 아닌 것을 찾는 다른 방법이 필요합니다.

나머지 줄 대신 1,2,3,6,9 줄을 grep하는 방법을 알려주실 수 있나요? 저는 awk를 수업시간에 다루지 않기 때문에 멀리하고 싶습니다.

답변1

\b이를 지원하는 구현 에서는 단어 문자(숫자 및 밑줄)와 단어가 아닌 문자(또는 그 반대로) 간의 grep변환에 사용됩니다. 예를 들어 \bPattern\b일치합니다.foo-Pattern.bar

공백을 구분해서 찾고 계시다면무늬한마디로 사용할 수 없습니다 \b.

Pattern여기에서는 문자 및 이외의 문자를 포함하는 0개 이상의 공백으로 구분된 문자열 목록이 뒤에 오는 공백 구분 기호를 찾고 있는 것처럼 보입니다 -. 따라서 다음과 같습니다.

non_word='([^[:blank:]]*[^[:blank:][:alpha:]-][^[:blank:]]*)'
grep -E "(^|[[:blank:]])Pattern([[:blank:]]+$non_word)*[[:blank:]]*$"

관련 정보