일치하는 줄에서 일치하는 줄과 n 번째 줄을 인쇄하십시오. 줄)에서 일치하는

일치하는 줄 (검색중인 표현식이 들어있는 줄)에서 일치하는 줄과 네 번째 줄을 인쇄하려고합니다.

다음 코드를 사용하고 있습니다.
sed -n 's/^[ \t]*//; /img class=\"devil_icon/,4p' input.txt

그러나 이것은 일치하는 줄만 인쇄합니다.

네 번째 줄만 인쇄합니다.
awk 'c&&!--c;/img class=\"devil_icon/{c=4}' input.txt

일치하는 줄과 네 번째 줄만 인쇄해야합니다.



답변

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배열에 레코드가 있는지 확인하여 레코드가 인쇄되는지 확인합니다.

두 번째 솔루션은 pattern해당 라인을 인쇄 한 다음 4 번째 레코드를 배열에 먼저 저장 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


답변

sed -n 's/^[ \t]*/; /img class=\"devil_icon/,+4 { 3,5d ; p }' input.txt

인쇄하기 전에 적절한 줄을 삭제하고 있습니다 { 3,5d ; p }.


답변

일치하는 줄 이후 몇 줄을 인쇄할지 지정하는 -A옵션을 사용해보십시오 grep. 이것을와 결합 sed하면 필요한 줄을 얻을 수 있습니다.

grep -A 4 pattern input.txt | sed -e '2,4d'

를 사용 sed하여 두 번째 줄에서 네 번째 줄까지를 삭제합니다.


답변

다음은 Perl에서 임의의 수의 일치하는 줄을 처리 할 수있는 방법입니다.

perl -ne '/pattern/ && do{$c=$.; print}; $.==$c+4 && print' file > new_file`

펄에서. 특수 변수 $.는 현재 줄 번호입니다. 따라서 일치하는 줄을 찾을 때마다 pattern인쇄하고 줄 번호를로 저장합니다 $c. 그런 다음 현재 줄 번호가 이전에 인쇄 된 줄 번호보다 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


답변