Как превратить вывод многострочной команды в строку через запятую в командном файле - PullRequest
2 голосов
/ 07 февраля 2020

Я пытаюсь проанализировать результат git diff --name-only, чтобы создать одну строку, содержащую все пути измененных файлов, разделенных запятыми. Например, результат сравнения может выглядеть следующим образом:

src/changed/file1.txt
src/changed/file2.txt
src/changed/file3.txt

, и я хочу получить

"src/changed/file1.txt,src/changed/file2.txt,src/changed/file3.txt"

У меня нулевой опыт написания пакетных сценариев, и до сих пор я собрал воедино это не работает:

Set concatenatedList = ""
for /f "delims=" %%a in ('git diff --name-only --diff-filter=d HEAD HEAD~1') do call :parse_results "%%a"
echo %concatenatedList%
pause
goto :EOF

:parse_results
Set output=%~1
echo output:%output%
Set source_dir=%output:~0,3%
IF "%source_dir%"=="src" Set concatenatedList = %concatenatedList%,%output%
goto :EOF

Как правильно это сделать?

Ответы [ 2 ]

1 голос
/ 07 февраля 2020

Команда set использует пробел как часть имени переменной до = и как часть значения переменной после =. Поэтому удалите пробел и дважды заключите строку в кавычки.

set "concatenatedList=%concatenatedList%%output,"

Вы также можете удалить запятую, добавив эту строку перед строкой echo.

set "concatenatedList=%concatenatedList:~-1%"
1 голос
/ 07 февраля 2020

Предупреждение: В этом ответе предполагается, что вы выполняете это в bash контексте с sed доступно


Я недостаточно опытен в bash, чтобы назвать это «правильным способом», но если это может помочь, вот как я это сделаю:

 git diff --name-only | sed -z 's/\n/\,/g'

(-z заменяет символ конца строки в контексте sed )

Остерегайтесь, однако, последнего трейлинга ,, который будет создан и может быть нежелательным, в зависимости от ваших потребностей.

...