Repete todos os arquivos e insere os cabeçalhos dos arquivos

2

Suponha que eu tenha esse projeto fictício:

$tree -L 3 ~/my-proj
./dir/foo.sh
./bar.sh

Eu 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.
 */

Eu estou lutando é multilinha, eu consegui escrever script abaixo, mas não trabalho 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/" {} \;
    
por Wayne Ye 29.09.2015 / 01:02

1 resposta

1

Use 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:

  1. O shell substituirá o valor de $header diretamente no comando sed. Isso permite a injeção de comandos arbitrários no script sed. Não não faça isso, a menos que você confie na origem do header .

  2. O cabeçalho contém / caracteres. Esses caracteres precisam ser escapados ou então o comando substituto deve usar um delimitador diferente. Acima, | foi usado como delimitador.

  3. É uma boa prática usar letras maiúsculas ou minúsculas para variáveis shell. O sistema usa maiúsculas para suas variáveis e, embora não seja um problema nesse caso, você não deseja sobrescrever acidentalmente um.

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
    
por 29.09.2015 / 01:14

Tags