일치하는 줄 (검색중인 표현식이 들어있는 줄)에서 일치하는 줄과 네 번째 줄을 인쇄하려고합니다.
다음 코드를 사용하고 있습니다.
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