첫 번째 일치 항목이 포함된 줄 위의 n 줄 앞의 모든 줄을 삭제합니다.

첫 번째 일치 항목이 포함된 줄 위의 n 줄 앞의 모든 줄을 삭제합니다.

파일에 다음 내용이 포함되어 있는 경우:

Line 1
Line 2
Line 3
Line 4
Line 5
Line 6
Line 7
Line 8
Line 9

이제 파일에 다음 내용만 포함되도록 "5번째 줄" 앞에 두 줄 이상 있는 줄을 삭제하려면 어떻게 해야 합니까?

Line 3
Line 4
Line 5
Line 6
Line 7
Line 8
Line 9

답변1

ed다음을 사용하여 주소 오프셋을 지원하는 것이 더 간단할 수 있습니다.

printf '%s\n' '/Line 5/-2,$p' | ed -s file

또는 (파일을 제자리에서 수정)

printf '%s\n' '1,/Line 5/-3d' 'wq' | ed -s file

답변2

이런 종류의 문제는 먼저 입력 행을 반대로 하면 더 쉽게 해결할 수 있습니다. 예를 들어:

$ tac ip.txt | awk '1; /Line 5/{n=3} n && !--n{exit}' | tac
Line 3
Line 4
Line 5
Line 6
Line 7
Line 8
Line 9

n && !--n{exit}true도달 하면 n이 됩니다 0. 이 경우 줄 Line 5에 다른 두 줄이 포함되어 있음을 의미합니다.

그리고 sed:

tac ip.txt | sed '/Line 5/{n; n; q}' | tac

노트: 위의 솔루션은 파일의 마지막 일치 항목과 일치하므로 일치 항목이 여러 개 있으면 작동하지 않습니다. 해결 방법은 다음과 같습니다.

awk '!f && /Line 5/{print p2 ORS p1; f=1} f; {p2=p1; p1=$0}' ip.txt

답변3

파일이 10,000줄 미만인 경우 다음을 사용할 수 있습니다.

grep -B2 -A9999 'test test' file

답변4

사용 pcregrep:

$ pcregrep -M "(.*\n){2}.*Line 5(.*\n)*" file

사용 awk:

$ awk -v var=2 '/Line 5/{n=NR; for(i=n-var;i<n;) print ar[i++]}
!n{ar[NR]=$0}n'

관련 정보