3

Я пытаюсь программно построить журнал изменений, перенаправив вывод git shortlog в файл CHANGELOG.md.

Мой список изменений выводит это (сокращенно):

Brendan Deere (4):
      Fix dependency conflicts

Мой файл журнала изменений (пустой) выглядит так:

CHANGELOG
===

Я пытаюсь использовать команду: sed "2a $(git shortlog)" ./CHANGELOG.md

Но я получаю эту ошибку: sed: -e expression #1, char 30: extra characters after command

Что я хочу это:

CHANGELOG
===
Brendan Deere (4):
      Fix dependency conflicts

Может кто-нибудь помочь соединить точки, которые мне не хватает?

4 ответа4

1

Я попытался запустить ваш sed sed "2a $(git shortlog)" ./CHANGELOG.md но я не мог найти решение. Я хотел бы увидеть исправление :).

Если бы 'git shortlog' был файлом, решение sed было бы с командой r чтобы прочитать файл.

sed 2r shortlog' ./CHANGELOG.md

Решение GNU sed может быть таким

sed '2 {h;s/.*/git shortlog/e;H;g}' ./CHANGELOG.md

1

Если текст для добавления / вставки занимает более одной строки, каждая строка, кроме последней, должна заканчиваться символом обратной косой черты вместо новой строки:

sed "2a $(git shortlog | sed '$! s/$/\\/')" old >new

Кроме того, вы можете сделать что -то вроде «gsed s/what /cmd /e» Пауло :

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 
0

Как насчет чего-то супер базового, такого как:

#!/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
0

Я пытаюсь использовать команду: sed "2a $(git shortlog)"./CHANGELOG.md

Но я получаю эту ошибку: sed: -e выражение # 1, символ 30: дополнительные символы после команды

Вы получаете эту ошибку, потому что команда, которая фактически выполняется из-за расширения оболочки, выглядит так

sed '2a Brendan Deere (4)[...]'

которая не является допустимой командой sed поскольку символы новой строки не экранированы.

Чтобы добиться того, чего вы хотите, вы можете сделать следующее с GNU sed:

gsed -i '2 {h;s/.*/git shortlog/e;H;g};3,$d' CHANGELOG.md

Будет:

  1. Сохраните 2 первые строки CHANGELOG.md
  2. Добавить вывод git shortlog
  3. Игнорировать все, что находится за (и в том числе) 3-й строкой CHANGELOG.md
  4. Запишите все обратно в CHANGELOG.md (создание временного файла)

Обратите внимание, что вы должны быть уверены, что при любом вызове, включая первый, CHANGELOG.md имеет 2 или более строк, в противном случае эта команда ничего не сделает.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .