일치하는 줄과 일치하는 줄(내가 찾고 있는 표현식이 포함된 줄) 내의 네 번째 줄을 인쇄하려고 합니다.
나는 다음 코드를 사용하고 있습니다 :
sed -n 's/^[ \t]*//; /img class=\"devil_icon/,4p' input.txt
그러나 이것은 일치하는 줄만 인쇄합니다.
그러면 네 번째 줄만 인쇄됩니다.
awk 'c&&!--c;/img class=\"devil_icon/{c=4}' input.txt
일치하는 줄과 네 번째 줄만 인쇄하면 됩니다.
답변1
awk에서는 할 수 있습니다
awk '/pattern/{nr[NR]; nr[NR+4]}; NR in nr' file > new_file`
또는
awk '/pattern/{print; nr[NR+4]; next}; NR in nr' file > new_file`
설명하다
첫 번째 솔루션은 일치하는 행을 모두 찾습니다 pattern
. 일치하는 항목을 찾으면 NR
레코드 번호( )를 배열에 저장합니다 nr
. 또한 NR
네 번째 레코드도 동일한 배열에 저장됩니다 . nr[NR+4]
그런 다음 NR
각 레코드()를 검사하여 해당 레코드가 배열에 있는지 확인 nr
하고 레코드가 있으면 인쇄하면 됩니다 .
두 번째 솔루션은 본질적으로 동일한 방식으로 작동합니다. 단, e를 만나면 pattern
해당 줄을 인쇄한 다음 네 번째 레코드를 배열에 저장 nr
하고 다음 레코드로 이동합니다. 그런 다음 awk
네 번째 레코드를 만나면 블록 NR in nr
이 실행되고 그 후에 +4 레코드가 인쇄됩니다.
예
이는 샘플 데이터 파일인 sample.txt
.
$ cat sample.txt
1
2
3
4 blah
5
6
7
8
9
10 blah
11
12
13
14
15
16
첫 번째 해결 방법을 사용하세요.
$ awk '/blah/{nr[NR]; nr[NR+4]}; NR in nr' sample.txt
4 blah
8
10 blah
14
두 번째 해결 방법을 사용하세요.
$ awk '/blah/{print; nr[NR+4]; next}; NR in nr' sample.txt
4 blah
8
10 blah
14
답변2
일치하는 줄 다음에 몇 줄을 인쇄해야 하는지 지정하는 -A
옵션을 사용해 볼 수 있습니다 . grep
이것을 결합하면 sed
원하는 행을 얻을 수 있습니다.
grep -A 4 pattern input.txt | sed -e '2,4d'
를 사용하여 sed
두 번째부터 네 번째 행까지 삭제합니다.
답변3
sed -n 's/^[ \t]*/; /img class=\"devil_icon/,+4 { 3,5d ; p }' input.txt
인쇄하기 전에 해당 줄을 삭제하면 됩니다 { 3,5d ; p }
.
답변4
awk 'c&&!--c;/img class=\"devil_icon/{c=4};/img class=\"devil_icon/' input.txt
본질적으로 찾기 및 바꾸기를 수행하고 있습니다. 그냥 추가하면 됩니다찾다동일한 명령에 입력하면 인쇄됩니다 :)
awk 'c&&!--c;/pattern/{c=4};/pattern/' input.txt