다음 prova.txt
과 같은 파일 이 있습니다.
Start to grab from here: 1
fix1
fix2
fix3
fix4
random1
random2
random3
random4
extra1
extra2
bla
Start to grab from here: 2
fix1
fix2
fix3
fix4
random1546
random2561
extra2
bla
bla
Start to grab from here: 1
fix1
fix2
fix3
fix4
random1
random22131
“여기서 시작하십시오”에서 첫 번째 빈 줄로 grep해야합니다. 출력은 다음과 같아야합니다.
Start to grab from here: 1
fix1
fix2
fix3
fix4
random1
random2
random3
random4
Start to grab from here: 2
fix1
fix2
fix3
fix4
random1546
random2561
Start to grab from here: 1
fix1
fix2
fix3
fix4
random1
random22131
보시다시피 “여기서 시작하기”이후의 줄은 무작위이므로 -A -B grep 플래그가 작동하지 않습니다.
cat prova.txt | grep "Start to grab from here" -A 15 | grep -B 15 "^$" > output.txt
빈 줄까지 잡을 첫 번째 줄을 잡는 방법 ( “여기서부터 시작”으로)을 찾는 방법을 알려 주시겠습니까? “여기서 시작하기”이후에 임의의 라인이 몇 줄인지 예측할 수 없습니다.
유닉스 호환 솔루션은 인정합니다 (grep, sed, awk가 perl 또는 유사한 것보다 낫습니다).
편집 : @ john1024의 화려한 응답 후 가능한지 알고 싶습니다.
1 ° 블록 정렬 (여기서 시작 시작에 따라 : 1, 1, 2)
2 ° 4 개 (알파벳으로 임의의) 행을 제거합니다. fix1, fix2, fix3, fix4 그러나 항상 4입니다.
3 °는 sort -u 명령과 같은 임의의 속임수를 제거합니다.
최종 출력은 다음과 같습니다.
# fix lines removed - match 1 first time
Start to grab from here: 1
random1
random2
random3
random4
#fix lines removed - match 1 second time
Start to grab from here: 1
#random1 removed cause is a dupe
random22131
#fix lines removed - match 2 that comes after 1
Start to grab from here: 2
random1546
random2561
또는
# fix lines removed - match 1 first time and the second too
Start to grab from here: 1
random1
random2
random3
random4
#random1 removed cause is a dupe
random22131
#fix lines removed - match 2 that comes after 1
Start to grab from here: 2
random1546
random2561
두 번째 출력은 첫 번째 출력보다 낫습니다. 다른 유닉스 명령 마법이 필요합니다.
답변
awk 사용
시험:
$ awk '/Start to grab/,/^$/' prova.txt
Start to grab from here: 1
random1
random2
random3
random4
Start to grab from here: 2
random1546
random2561
Start to grab from here: 3
random45
random22131
/Start to grab/,/^$/
범위를 정의합니다. 일치하는 모든 줄로 시작하고 그 뒤에 Start to grab
오는 첫 번째 빈 줄로 끝납니다 ^$
.
sed 사용
매우 유사한 논리로 :
$ sed -n '/Start to grab/,/^$/p' prova.txt
Start to grab from here: 1
random1
random2
random3
random4
Start to grab from here: 2
random1546
random2561
Start to grab from here: 3
random45
random22131
-n
sed는 명시 적으로 요청하지 않는 한 아무 것도 인쇄하지 말라고 지시합니다. /Start to grab/,/^$/p
로 정의 된 범위 내의 모든 행을 인쇄하도록 지시합니다 /Start to grab/,/^$/
.
답변
일부 사람들의 사용 사례에 유용 할 수있는 대체 솔루션을 게시하고 있습니다. 이 솔루션은 명시된 요구 사항을 정확히 준수하지 않습니다. 최상의 솔루션은 @ John1024의 답변을 참조하십시오.
레코드 구분 기호를 빈 문자열로 설정하여 awk를 사용할 수 있습니다. awk는이를 빈 줄 바꿈으로 해석합니다.
$ awk '/Start/' RS= prova.txt
Start to grab from here: 1
fix1
fix2
fix3
fix4
random1
random2
random3
random4
Start to grab from here: 2
fix1
fix2
fix3
fix4
random1546
random2561
Start to grab from here: 1
fix1
fix2
fix3
fix4
random1
random22131
이 버전은 출력에서 빈 줄 바꿈을 유지하지 않습니다. 또한 존재하는 경우 경기 전에 컨텍스트를 표시합니다. 이 동작은 파일에서 무언가를 잡을 때 매우 유용 할 수 있으며 다음과 같이 줄 바꿈으로 구분 된 블록을 보려고합니다.
$ awk '/random1546/' RS= prova.txt
Start to grab from here: 2
fix1
fix2
fix3
fix4
random1546
random2561
예를 들어 ini
파일 에서 물건을 잡을 때 유용 합니다.