Suponha que eu tenha este projeto fictício:
$tree -L 3 ~/my-proj
./dir/foo.sh
./bar.sh
Quero inserir o cabeçalho do arquivo de direitos autorais em todos os arquivos *.sh, por exemplo, meu cabeçalho é:
/*
* Copyright (c) 2015 by MyCompany, Inc.
* All rights reserved.
*/
Estou lutando, é multilinha, consegui escrever o script abaixo, mas não funciona para multilinha:
#!/bin/sh
HEADER=$(cat<<EOH
/*
* Copyright (c) 2015 by MyCompany, Inc.
* All rights reserved.
*/
)
find ~/my-proj/*.sh -exec sed -i "1s/^/$HEADER\n/" {} \;
Responder1
Usa isto:
header='/*\n * Copyright (c) 2015 by MyCompany, Inc.\n * All rights reserved.\n */\n'
find ~/my-proj/*.sh -exec sed -i "1s|^|$header|" {} \;
Notas:
O shell substituirá o valor
$header
diretamente no comando sed. Isso permite a injeção de comandos arbitrários no script sed. Fazernãofaça isso a menos que você confie na fonte do arquivoheader
.O cabeçalho contém
/
caracteres. Esses caracteres devem ser escapados ou o comando substituto deve usar um delimitador diferente. Acima,|
foi usado como delimitador.É uma prática recomendada usar letras minúsculas ou mistas para variáveis de shell. O sistema usa letras maiúsculas para suas variáveis e, embora não seja um problema neste caso, você não deseja sobrescrever uma acidentalmente.
Exemplo
Para ilustrar o comando sed revisado, considere este arquivo de teste:
$ cat file
1
2
3
O comando sed produz:
$ sed "1s|^|$header|" file
/*
* Copyright (c) 2015 by MyCompany, Inc.
* All rights reserved.
*/
1
2
3