Sed - Como posso inserir uma string após uma determinada linha E um certo caractere?

1

Eu preciso inserir algumas linhas de código em um arquivo. O problema é que eu quero inseri-lo depois de alguma chamada de função E depois do ponto-e-vírgula por trás dele também.

Eu gostaria de conseguir isso apenas com sed , mas não sei por quê.

Exemplo:

Snippet de código-fonte:

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

Aqui, quero inserir o snippet por trás da chamada myFunc() , mas não posso inseri-lo diretamente na linha 13, mas na linha 15.

Código desejado após a inserção:

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

Minha melhor tentativa é esta:

sed -e '13 i\SNIPPET'

O que obviamente não "espera" pelo ponto e vírgula.

Então, existe alguma maneira de combinar essas condições, então eu inseri meu trecho de código após o primeiro ponto e vírgula após o número da linha ***?

    
por Eenoku 11.12.2015 / 15:59

2 respostas

2

Que tal:

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

Ou para a linha 13:

sed '
  13!b
  :1 
  s/;/; SNIPPET/;t
  n;b1'
    
por 11.12.2015 / 17:41
0

Eu não usaria sed - não acho que seja uma boa ferramenta para esse propósito, devido à sua natureza inerente à linha.

Eu gostaria de sugerir:

#!/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 <>;

Nota - isto extrai a numeração do conteúdo, com base no seu exemplo. Eu não sabia se você queria números de linha reais - embora sed -e '13 ..' implique que você faça isso.

Nesse caso:

if ( $. > 13 and m/;/ ) {
    print "SNIPPET\n"; 
    last;
}
    
por 11.12.2015 / 17:19

Tags