sed를 사용하여 일치 항목 위에 X 줄을 추가합니다.

sed를 사용하여 일치 항목 위에 X 줄을 추가합니다.

나는 내가 해야 할 일을 추가/추가하는 방법을 알고 있습니다.

sed -i '/pattern/a new thing!'

그런데 한 줄을 일치시키고 그 앞에 두 줄을 더 추가하고 싶습니다.

awk우분투 12.04에서 기본으로 제공되는 도구로 도구를 제한하고 싶습니다. 그것이 적합한 지 모르겠습니다 .

문제 B에 대한 해결책을 찾는 동안 문제 A를 해결해야 하는 경우를 대비해 .m3u8 파일에서 발췌한 내용은 다음과 같습니다.

#EXTINF:4.304300,
output-000.ts
#EXTINF:5.705700,
output-001.ts
#EXTINF:4.304300,
output-002.ts
#EXTINF:5.705700,
output-003.ts

이제 내 목표는 각 X'번째 앞에 2개의 행을 삽입하는 것입니다 output-XXX.ts. 예를 들어 다음을 구현하고 싶습니다.

#Inserted line 0
#EXTINF:4.304300,
output-000.ts
#EXTINF:5.705700,
output-001.ts
#Inserted line 1
#EXTINF:4.304300,
output-002.ts
#EXTINF:5.705700,
output-003.ts

답변1

사용 awk(우분투를 포함한 POSIX 시스템에 기본적으로 설치됨):

POSIXLY_CORRECT=1 awk -v X=2 '
  NR >= 2 && /^output-[0-9]{3}\.ts$/ && ++n % X == 1 {
    print "#Inserted line", i++
  }
  NR>1 {print last}
  {last = $0}
  END{if (NR) print last}' < file.in > file.out

위 2줄의 내용입니다. 위의 N 줄에 요약되어 있습니다.

POSIXLY_CORRECT=1 awk -v N=2 -v X=2 '
  BEGIN{N--}
  NR > N {
    if (/^output-[0-9]{3}\.ts$/ && ++n % X == 1)
      print "#Inserted line", i++
    print l[NR % N]
  }
  {l[NR % N] = $0}
  END{
    for (i = NR > N ? NR - N + 1 : 1; i <= NR; i++) print l[i % N]
  }'

답변2

Perl이 구조에 옵니다:

< .m3u8  perl -ne 'push @w, $_;
                   unshift @w, "#Inserted line " . (0 + $c++) . "\n"
                       if /^output-[0-9]+\.ts/ && 0 == $m++ % 2;
                   print shift @w while @w > 1;
                   }{ print @w;'

@w마지막 두 행을 유지하는 "슬라이딩 윈도우" 배열입니다. $m일치 항목 수, 즉 지금까지 발견된 "output-XXXX" 줄 수를 포함하므로 모듈로 2가 0을 제공하면 매 두 번째 일치 항목을 선택하게 됩니다. unshiftWindows 배열의 시작 부분에 행을 삽입한 다음 shift검색합니다. 마지막으로 나머지 라인을 출력해야 합니다.

관련 정보