다음과 같은 줄이 포함된 텍스트 파일이 있습니다(마지막 두 문자열만 중요함).
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:]]*$"