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;
}

相关内容