이 질문은 이미 여기에 답변이 있습니다. :
댓글
답변
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
및 , 다른 것은 없습니다.
댓글
- 와, 저도 같은 문제가 있었는데 ' 묻지 않았습니다. 2 개의
grep -n
인스턴스를 사용하고 내 솔루션의 수를 비교했습니다.
- @KipK 범위 표현식은 이러한 종류의 문제에 매우 유용한 도구입니다.) 할 수 있습니다. 또한
awk
및 일부 플래그를 사용하지만 기본적인 경우는 이것으로 매우 간단합니다.
- @Fedorqui, 검색 패턴에 xml이 포함되어 있으면 문제가 발생합니다. 예를 들어 < ns0 : abcd xmlns = " " >, 결과를 가져옵니다. 그러나 < abcd xmlns = " " 도 있습니다. sed -n ' / \ < ns0 \ : abcd xmlns \ = \ " \ " \ > /, / \ < ns0 \ : abcd \ > / p 파일
- @MukulAn 그리고 우리가 교차 점검 할 수 있도록 예제를 제공하세요
- 어떤 방식 으로든 아니요 시작 및 끝 패턴 자체를 인쇄합니까 (머리 및 꼬리 사용 제외)?
답변
sed
sed -n " /^aaa$/,/^cdn$/w output1 /^zdk$/,/^dke$/w output2 " file
답변
다음은 grep
명령입니다.
grep -o "aaa.*cdn" <(paste -sd_ file) | tr "_" "\n"
,하지만 grep
에 대해 perl-regexp를 사용해야합니다 (-P
-일부 플랫폼에서 지원되지 않음). , OS X처럼), 해결 방법으로 “새 줄을 _
문자로 바꾸고 grep
이후에 다시 변경됩니다.
또는 는 여러 줄 패턴을 지원합니다 (-M
).
또는 ex
:
ex +"/aaa/,/cdn/p" -scq! file