2017-10-18 3 views
0

안녕하세요, 저는 한 줄로 두 번 반복되는 단어가있는 grep 행을 알고 싶습니다. 두 단어 사이의 간격은 분명히 고려되어야하며 대소 문자를 구별해야합니다. 나는 grep이 자연스럽게 존재한다고 믿습니다.grep 또는 egrep 단어를 두 번 연속 표시하는 방법은 무엇입니까?

나는 답을 원하지만 오히려 그것을 어떻게하는지 이해하고 싶다. 따라서 응답하는 사람은 회선이 말하는 내용이나 패턴이 무엇을하는지 설명하십시오. 나는 grepbash에 대한 기초적인 중급 이해력을 가지고 있지만 여전히 grep의 모든 복잡함과 상관 구문을 배우고 있습니다. 모든 도움이 많이 감사 할 것입니다. 내가 여기서 뭐하는 거지 정확히 무엇도 확실하지 오전하지만 내가 롤 확보하지 못했로

이것은 ... 모든

grep '.*\|.*\| ' 

덕분에 가깝다! 건배!

답변

0

당신은 grep -E '(\<[^[:blank:]]+\>).*\1'

\<\>는 단어 경계를 나타냅니다 사용할 수 있습니다. 공백이 아닌 문자 시퀀스와 함께 단일 단어를 형성합니다. 그런 다음 \1은 캡처 링 괄호의 첫 번째 집합을 호출합니다.

+0

불행히도 많은 도구가 약간 다른 정규 표현식을 사용합니다. GNU 도구 (grep, awk 등)의 정규식은 https://www.gnu.org/software/gnulib/manual/html_node/Regular-expression-syntaxes.html#Regular-expression-syntaxes에서 찾을 수 있습니다. –

0

\ 1은 일치 된 첫 번째 문자열과 일치하는 모든 문자열과 일치합니다. 첫 번째 문자열과 일치하는 패턴과 일치하는 것은 아닙니다. 따라서 \ b가 캡처 괄호 안에 있더라도 단어 경계에 일치하는 첫 번째 캡처는 더 이상 적합하지 않습니다.

두 번째 인스턴스가 단어 경계에 있도록하려면 다음과 같이하십시오.

또한 정규식을 사용하여 모든 작은 a-z 및 큰 A-Z 단어를 원한다고 말할 수 있습니다. 또한 +를 사용하여 앞의 문자가 적어도 1 회 이상 일치한다고 말합니다.

egrep "(\b[a-zA-Z]+) \1\b" file.txt 

두 번 사용 된 단어가 모두 표시됩니다.

grep -E "(\b[a-zA-Z]+) \1\b" file.txt 

이 명령은 grep을 사용하려는 경우에도 작동합니다. grep -E은 확장 된 정규식을 사용함을 의미합니다. 그래서 egrep과 같습니다.

관련 문제