파일에 다음 내용이 포함되어 있는 경우:
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'