패턴 뒤 세 번째 행에 행을 삽입하고 싶습니다. 예: z
각 일치 항목 뒤에 단어 3줄을 삽입합니다.a
~에서
a
b1
c1
d1
a
b2
c2
d2
...
도착하다
a
b1
c1
z
d1
a
b2
c2
z
d2
...
답변1
$ awk '/a/{c=1} (c++)==4{print "z"} 1' file
a
b1
c1
z
d1
a
b2
c2
z
d2
답변2
답변3
다음과 같은 작업이 수행됩니다.
awk 'BEGIN {v1=-100} {if ($1=="a") v1=FNR;if (FNR-v1==3) print "z"; print $0}' input_file
스크립트는 레코드가 "a"인지 확인하고 현재 행을 가리키도록 변수를 설정합니다. 그런 다음 현재 레코드 행에서 이전에 저장된 행을 뺀 값이 3인지 확인하고 문자열을 인쇄한 다음 현재 행을 인쇄합니다.
답변4
ed
이를 수행하려면 스크립트 가능한 편집기를 사용할 수 있습니다 . z
일치 항목 뒤에 전체적으로 세 줄을 삽입하십시오 /a/
.
$ ed -s input-file
g/a/+3i\
z
wq
또는 한 줄로:
printf '%s\n' 'g/a/+3i\' 'z' 'wq' | ed -s input-file
명령은 다음 ed
과 같습니다:
g/a/+3i\
-- 후속 명령을 전체적으로 실행합니다. 즉, /a/ 뒤의 세 줄을 일치시키고 일부 텍스트를 삽입합니다. 후행 백슬래시는 삽입 명령을 다음 줄로 계속합니다.z
- 텍스트를 삽입합니다z
. 후행 백슬래시가 없기 때문에 insert 명령이 종료되고 전역 실행이 완료됩니다.wq
-- 파일을 다시 디스크에 쓰고 종료합니다.