Sed - 特定の行と特定の文字の後に文字列を挿入する方法は?

Sed - 特定の行と特定の文字の後に文字列を挿入する方法は?

ファイルに数行のコードを挿入する必要があります。問題は、特定の関数呼び出しの後とその後のセミコロンの後に挿入したいということです。

でこれを達成したいのですが、sed理由がわかりません。


例:

ソースコードの断片:

10 printf("asdf");
11
12 myFunc()
13
14 ;

ここでは、呼び出し後にコードスニペットを挿入したいのですが、myFunc()13行ではなく15行に直接挿入したいと思います。

挿入後に必要なコード:

10 printf("asdf");
11
12 myFunc()
13
14 ;
15 SNIPPET

私の最善の試みは次のとおりです。

sed -e '13 i\SNIPPET'

これは明らかにセミコロンを「待つ」ことはありません。

それでは、これらの条件を組み合わせて行番号***の後の最初のセミコロンの後にコードスニペットを挿入する方法はありますか?

答え1

どうですか?

sed '
  /myFunc()/!b
  :1 
  s/;/; SNIPPET/;t
  n;b1'

または13行目の場合:

sed '
  13!b
  :1 
  s/;/; SNIPPET/;t
  n;b1'

答え2

私は使用しませんsed。本質的に行指向の性質のため、この目的には良いツールだとは思わない。

私は以下をお勧めします:

#!/usr/bin/env perl
use strict;
use warnings;

while (<>) {
    #print current line (because we insert _after) 
    print;
    #extract the number. If you need to work on _actual_ line number, you need $.
    my ($num) = m/^(\d+)/;
    if ( $num > 13 and m/;/ ) {
        #print snippet, bail out
        print ++$num, " SNIPPET\n";    
        last;
    }
}
#print rest of file
print <>;

注 - これはあなたの例に基づいてコンテンツから数字を抽出します。実際の行番号が欲しいかどうかはわかりません。もちろんsed -e '13 ..'そうなるという暗示があるのですが。

この場合:

if ( $. > 13 and m/;/ ) {
    print "SNIPPET\n"; 
    last;
}

関連情報