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'
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ê.
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.
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 ***?
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'
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;
}
Tags sed