Que tal algo super básico como:
#!/usr/bin/env bash
head -n 2 CHANGELOG.md >CHANGELOG.md.tmp
git shortlog >>CHANGELOG.md.tmp
tail -n +3 CHANGELOG.tmp >> CHANGELOG.md.tmp
rm CHANGELOG.md
mv CHANGELOG.md.tmp CHANGELOG.md
Eu estou tentando construir um changelog programaticamente redirecionando a saída de git shortlog
para um arquivo CHANGELOG.md.
Meu changelog mostra isso (abreviado):
Brendan Deere (4): Fix dependency conflicts
Meu arquivo de changelog (vazio) se parece com isto:
CHANGELOG ===
O comando que estou tentando usar é:
sed "2a $(git shortlog)" ./CHANGELOG.md
Mas recebo este erro: sed: -e expression #1, char 30: extra characters after command
O que eu quero é:
CHANGELOG === Brendan Deere (4): Fix dependency conflicts
Alguém pode ajudar a conectar os pontos que estou perdendo?
Eu tentei executar o seu sed sed "2a $(git shortlog)" ./CHANGELOG.md
, mas não consegui descobrir uma solução.
Eu gostaria de ver uma correção:).
Se o 'git shortlog' era um arquivo, uma solução sed seria com o comando r
para ler o arquivo.
sed 2r shortlog' ./CHANGELOG.md
Uma solução de GNU sed poderia ser que
sed '2 {h;s/.*/git shortlog/e;H;g}' ./CHANGELOG.md
Quando o texto a ser acrescentado / inserido é mais de uma linha, cada linha exceto a última deve terminar com barra invertida-nova linha em vez da nova linha normal:
sed "2a $(git shortlog | sed '$! s/$/\/')" old >new
Alternativamente, como uma variação do Paulo 'gsed s / whatever / cmd / e', você poderia fazer:
awk '1;NR==2{system("git shortlog")}' old >new
# note: 1 is the simplest possible pattern that matches all lines;
# since no action is given the default is to print each line;
# after printing line 2 we run the command with output to same stdout
The command I am trying to use is: sed "2a $(git shortlog)" ./CHANGELOG.md
But I get this error: sed: -e expression #1, char 30: extra characters after command
Você recebe este erro porque o comando que está sendo executado, devido à expansão pelo shell, parece
sed '2a Brendan Deere (4)[...]'
que não é um comando sed
válido, pois as novas linhas não são ignoradas.
Para conseguir o que você quer, você pode fazer o seguinte com o GNU sed
:
gsed -i '2 {h;s/.*/git shortlog/e;H;g};3,$d' CHANGELOG.md
Irá:
CHANGELOG.md
git shortlog
CHANGELOG.md
CHANGELOG.md
(criando um arquivo temporário
arquivo) Note que você precisa ter certeza de que, em qualquer chamada, incluindo a primeira, CHANGELOG.md
tem 2 ou mais linhas, caso contrário, este comando não fará nada.
Tags command-line bash sed