
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
"여기서 잡기 시작"에서 첫 번째 빈 줄까지 이동해야 합니다. 출력은 다음과 같아야 합니다.
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
빈 줄까지 잡을 첫 번째 줄("여기에서 잡기 시작")을 잡는 방법을 찾는 데 도움을 주실 수 있나요? "여기에서 잡기 시작" 이후에 얼마나 많은 임의의 줄이 생길지 예측할 수 없습니다.
모든 Unix 호환 솔루션을 높이 평가합니다(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
두 번째 출력이 첫 번째 출력보다 더 좋습니다. 다른 유닉스 명령 마법이 필요합니다.
답변1
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/,/^$/
.
답변2
일부 사람들의 사용 사례에 유용할 수 있으므로 대체 솔루션을 게시하고 있습니다. 이 솔루션은 명시된 요구 사항을 정확하게 준수하지 않습니다. 최상의 솔루션은 @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
.