편집됨: @john1024의 훌륭한 답변 이후 다음이 가능한지 알고 싶습니다.

편집됨: @john1024의 훌륭한 답변 이후 다음이 가능한지 알고 싶습니다.

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.

관련 정보