Substituindo o final de algumas centenas de arquivos

2

Eu preciso mudar o modo como algumas centenas de módulos do Perl terminam. Atualmente eles terminam como

1;

No entanto, preciso modificar isso para que todos tenham isso em suas últimas linhas.

BEGIN {
    # VERSION
}
1;
# ABSTRACT: table definition

É claro que tenho certeza que poderia fazer isso com o Perl provavelmente usando o PPI, mas também parece que eu poderia apenas sed ou awk o final desses arquivos. Alguém pode dar alguma sugestão de como isso pode ser feito?

    
por xenoterracide 18.06.2011 / 23:13

1 resposta

3

Isso é realmente feito com o GNU sed, graças à combinação de $ para atuar na última linha e -i para modificar arquivos no lugar. Isso pressupõe que 1; esteja na última linha, caso contrário, seria muito mais complicado.

sed -i -e '$s/^1;$/BEGIN {\
    # VERSION\
}\
1;\
# ABSTRACT: table definition/' *.pm

Com o Perl, como os arquivos são pequenos, basta carregá-los totalmente na memória. Desta forma, é fácil ser mais flexível, por ex. permitir espaços e comentários e __DATA__ após 1; (permitindo que o POD seja deixado como um exercício para o leitor).

perl -0777 -pe 's/\n\s*1\s*;(?=(?:\s*(?:#.*)?\n)*(?:\s*__(?:DATA|END)__\b)?\Z)/\nBEGIN…definition/' *.pm
    
por 18.06.2011 / 23:49