![시작 패턴과 끝 패턴 사이의 줄을 찾는 방법은 무엇입니까? [복사]](https://linux55.com/image/75349/%EC%8B%9C%EC%9E%91%20%ED%8C%A8%ED%84%B4%EA%B3%BC%20%EB%81%9D%20%ED%8C%A8%ED%84%B4%20%EC%82%AC%EC%9D%B4%EC%9D%98%20%EC%A4%84%EC%9D%84%20%EC%B0%BE%EB%8A%94%20%EB%B0%A9%EB%B2%95%EC%9D%80%20%EB%AC%B4%EC%97%87%EC%9E%85%EB%8B%88%EA%B9%8C%3F%20%5B%EB%B3%B5%EC%82%AC%5D.png)
다음 내용이 포함된 파일이 있습니다.
zdk
aaa
b12
cdn
dke
kdn
입력 1: aaa
및cdn
출력 1:
aaa
b12
cdn
입력 2: zdk
및dke
출력 2:
zdk
aaa
b12
cdn
dke
다음 명령을 사용하여 이를 달성할 수 있습니다.
grep -a aaa -A2 file # Output 1
grep -a aaa -A4 file # Output 2
하지만 파일에서 끝 문자열 패턴이 발생하는 위치(위치)를 정확히 알 수 없습니다(파일에는 20000줄이 있습니다).
이 목표를 어떻게 달성할 수 있나요?
답변1
grep
여기서는 당신을 도울 수 없습니다. sed
범위 표현식을 사용하면 이 작업을 더 잘 수행할 수 있습니다.
$ sed -n '/aaa/,/cdn/p' file
aaa
b12
cdn
$ sed -n '/zdk/,/dke/p' file
zdk
aaa
b12
cdn
dke
sed -n
명시적으로 요청한 경우에만 행이 인쇄되도록 자동 인쇄를 억제합니다. /aaa/,/cdn/
이는 범위가 발생할 때 발생합니다.
이러한 범위 표현식은 에서도 사용할 수 있습니다 awk
. 다음과 같이 말할 수 있습니다.
awk '/zdk/,/dke/' file
sed -n '/^aaa$/,/^cdn$/p' file
물론 이러한 모든 조건은 한 줄이 완전히 포함되어 있는지 확인 aaa
하고 cdn
다른 것은 포함되지 않는지 확인 하는 등 보다 제한적인 정규식으로 확장될 수 있습니다 .
답변2
이는 다음을 통해 수행할 수 있습니다.sed
sed -n '
/^aaa$/,/^cdn$/w output1
/^zdk$/,/^dke$/w output2
' file
답변3
이것은 grep
명령입니다:
grep -o "aaa.*cdn" <(paste -sd_ file) | tr '_' '\n'
여러 줄 일치를 달성할 수 있지만 ( -OS X와 같은 모든 플랫폼에서는 지원되지 않음) grep
perl-regexp를 사용해야 합니다 . 따라서 해결 방법으로 새 줄을 문자로 바꾼 다음 다시 변경합니다.grep
-P
_
grep
아니면 당신은 사용할 수 있습니다pcregrep
다중 라인 모드( -M
)를 지원합니다.
또는 다음을 사용하십시오 ex
.
ex +"/aaa/,/cdn/p" -scq! file