複数のファイルの特定の行にシーケンス番号を追加する

複数のファイルの特定の行にシーケンス番号を追加する

ファイルの特定の行にシリアル番号を追加し、他のファイルに追加するコマンドを教えることができる人はいますか?

例:5つのファイル(メッセージ)があります。各メッセージファイルの5行目に件名:1、件名:2、件名:3...などの増分シーケンス番号を追加したいと思います。サンプル出力は次のとおりです。

File1: line5: Subject: **1** message
File2: line5: Subject: **2** message
File3: line5: Subject: **3** message
File4: line5: Subject: **4** message
File5: line5: Subject: **5** message

答え1

次のコマンドを試してみましたが、正常に動作しました。

for i in 5; do sed -i ''$i'i subject '$i'' file1;j=$(($i+1)); sed -i  ''$i'i subject '$j'' file2;k=$(($j+1)); sed -i ''$i'i subject '$k' ' file3;l=$(($k+1));sed -i ''$i'i subject '$l'' file4;m=$(($l+1)); sed -i ''$i'i subject '$m'' file5;done

答え2

私は以下を使用しますperl

perl -pi -e 's/^Subject: \K/sprintf("%05d ", ++$n)/e' File*

Subject:行が表示されるたびに増加する数字(幅5までのパディング0)が追加されます。

最初の発生のみ:

perl -pi -e '
  unless ($found_already) {
    $found_already = 1 if s/^Subject: \K/sprintf("%05d ", ++$n)/e
  }
  $found_already = 0 if eof' File*

Subject: <increasing-number>各ファイルの5行目に追加するには:

perl -pi -e '$_ = sprintf("Subject: %05d %s", ++$n, $_) if $. == 5; 
             close ARGV if eof' File*

ファイルはシェルのglob拡張によって決定された順序でPerlに提供されます。ほとんどのシェルでは、これは語彙の順序です。ファイル名番号が記入されていない場合、File10これはに表示されますFile2zshシェルを使用すると、数字でソートされたリストFile*に置き換えたり、ファイルの寿命(最も古いものから最も若いものまで)に並べ替えることができます。File*(n)File*(Om)

関連情報