私は何をすべきかを追加/追加する方法を知っています。
sed -i '/pattern/a new thing!'
ちなみに、1行にマッチさせ、その前に2行追加します。
awk
Ubuntu 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
(Ubuntuを含む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
最後の2行を保持する「スライドウィンドウ」の配列。$m
一致の数、つまりこれまでに見つかった「output-XXXX」行の数が含まれているため、モジュロ2がゼロを指定すると、2番目の一致を毎回選択します。unshift
Windowsアレイの先頭に行を挿入してshift
検索します。最後に、残りの行を出力する必要があります。