고정 텍스트에서 시작하여 첫 번째 빈 줄까지 Grep here: 1 fix1 fix2 fix3 fix4 random1 random22131 “여기서

다음 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

-nsed는 명시 적으로 요청하지 않는 한 아무 것도 인쇄하지 말라고 지시합니다. /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파일 에서 물건을 잡을 때 유용 합니다.


답변