Estou tentando adicionar um cabeçalho de licença a todos os arquivos de cabeçalho e arquivos de origem em um diretório de projeto usando um loop for. Isso não está funcionando, existe alguma outra abordagem usando sed
?
text-processing
shell-script
Satyendra
fonte
fonte
Respostas:
fonte
globstar
bash para que isso funcione.Este é mais ou menos apenas um comentário estendido sobre a resposta de Daniel Serodio . Comecei a escrever como um comentário, mas rapidamente cresceu muito ...
Para que um bash glob seja recursivo, é necessário
shopt -s globstar
. Você deve ativar o globstar, caso contrário**
não funcionará. A opção de shell globstar foi introduzida na versão 4 do bash.Para evitar o processamento de um diretório como
my.cpp/
, use o teste[[ -f $f ]]
... Quando o teste está entre colchetes duplos, as variáveis não precisam ser citadas duas vezes.Você também pode considerar a possibilidade de não haver arquivos correspondentes usando
shopt -s nullglob
, o que permite que os padrões que não correspondem a arquivos sejam expandidos para uma cadeia nula, e não para eles próprios.Para lidar com múltiplos padrões, você pode encadear os padrões glob:
**/*.cpp **/*.h
, mas talvez de preferência, quando a opção shell extglob é na viashopt -s extglob
, você pode usar tais construções, como**/*.@(cpp|h)
o que evita várias passagens sobre o sistema de arquivos; uma vez para cada padrão.Se você deseja
.files
ser incluído, use.*.cpp
etc ou useshopt -s dotglob
Para manipular com segurança a modificação de um arquivo que está sendo canalizado, use
sponge
from packagemoreutils
(economiza a necessidade de criar seu próprio arquivo temporário)fonte
[[
pode lidar normalmente com um nulo$f
.unset x; [ -f $x ] && echo exists
relatórios "existe" ... (fixo)**/*.@(cpp|h)
por$( find . -name "*.h" -name "*.cpp")
Obrigado @fred, @maxmackie, @enzotib.
Você pode, por favor, verificar o procedimento que segui.
caso contrário, o cabeçalho da licença será copiado para vários números de vezes.
Por favor, sugira-me um padrão para percorrer todos os cabeçalhos e fontes no diretório e subdiretórios do projeto.
Não consegui entender completamente o que o @fred sugeriu.
fonte
targln=2; findln=$(sed -rne $targln'{\|// Copyright|=;q}' "$f"); if ((findln==targln));then
... mas, é claro, acima e além de tudo o mais, teste-o primeiro ... PS. É par para o curso aqui no Unix e Linux para postar esses extras na sua pergunta original, não como uma resposta ...grep
, adicione a-q
opção agrep
. Sempre adicione aspas duplas$f
.Você pode fazer isso com
ex
oued
se preferir (não o façased
conforme solicitado),sed
foi projetado para editar fluxos,-i
é uma má ideia por vários motivos):fonte
sed -i
uma má ideia?sed -i
quebra links simbólicos e hardlinks, resultando em comportamento inesperado. Na melhor das hipóteses, não é intuitivo; na pior, é ativamente prejudicial.Se você tiver um
header_file
com o conteúdo desejado:fonte
fonte
Blog de Gerhard Gappmeier - Como recursivamente substituir cabeçalhos de arquivos de arquivos de origem
A postagem do blog anexou um
tar.gz
arquivo, contendo os arquivos necessários.Ele tem um
header.template
arquivo, onde você pode escrever um comentário personalizado, pode abranger várias linhas.Ele possui um
remove_header.awk
script que substitui os cabeçalhos existentes pelo novo cabeçalho.Para executá-lo:
fonte