나는 내가 해야 할 일을 추가/추가하는 방법을 알고 있습니다.
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을 제공하면 매 두 번째 일치 항목을 선택하게 됩니다. unshift
Windows 배열의 시작 부분에 행을 삽입한 다음 shift
검색합니다. 마지막으로 나머지 라인을 출력해야 합니다.