일치하는 줄과 일치하는 줄 내의 n번째 줄을 인쇄합니다.

일치하는 줄과 일치하는 줄 내의 n번째 줄을 인쇄합니다.

일치하는 줄과 일치하는 줄(내가 찾고 있는 표현식이 포함된 줄) 내의 네 번째 줄을 인쇄하려고 합니다.

나는 다음 코드를 사용하고 있습니다 : 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

관련 정보