sed を使用して一致に X 行を追加します。

sed を使用して一致に X 行を追加します。

私は何をすべきかを追加/追加する方法を知っています。

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

ちなみに、1行にマッチさせ、その前に2行追加します。

awkUbuntu 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]
  }'

おすすめ記事