편집: @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

두 번째 출력이 첫 번째 출력보다 더 좋습니다. 몇 가지 추가적인 Unix 명령 마법이 필요합니다.

답변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

이 버전은 출력 시 공백 개행을 유지하지 않습니다. 또한 사전 일치 컨텍스트가 있는 경우 표시됩니다. 이 동작은 grep이 파일에서 무언가를 찾고 있고 그것이 속한 개행으로 구분된 블록을 보고자 할 때 유용합니다. 예를 들면 다음과 같습니다.

$ awk '/random1546/' RS= prova.txt 
Start to grab from here: 2
fix1
fix2
fix3
fix4
random1546
random2561

ini예를 들어 파일에서 콘텐츠를 찾을 때 이것이 유용하다는 것을 알았습니다 .

관련 정보