Вопрос или проблема
Я могу найти все файлы в директории с определённым именем с помощью команды find:
find . -name hello.mk
В каждом файле hello.mk
мне нужно заменить строки 9 и 10 на одну строку, как показано ниже:
9: HELLO_LATEST = $(shell \
10: curl -f -s https://api.github.com/repos/org/repo/releases | jq -r 'map(select(.prerelease)) | .[0].tag_name')
на
9: HELLO_LATEST = $(shell curl -s https://api.github.com/repos/org/repo/releases | grep tag_name | cut -d\" -f4)
и я хочу сделать это на месте. Как я могу это осуществить в bash?
Ответ или решение
Чтобы заменить строки 9 и 10 в файлах hello.mk
на одну строку в командной оболочке bash, вы можете использовать комбинацию команд find
, sed
и -exec
. Вот как это можно сделать:
-
Находим файлы: Сначала мы используем команду
find
, чтобы найти все файлы с именемhello.mk
в текущем каталоге и его подкаталогах. -
Замена строк: Используем
sed
для выполнения замены непосредственно в файлах. Мы укажемsed
заменить строки 9 и 10 на новую строку.
Вот пример команды, которая выполняет описанные действия:
find . -name hello.mk -exec sed -i '9s/.*/HELLO_LATEST = $(shell curl -s https:\/\/api.github.com\/repos\/org\/repo\/releases | grep tag_name | cut -d\" -f4)/; 10d' {} +
Объяснение команды:
find . -name hello.mk
— ищем все файлы с именемhello.mk
в текущем каталоге и подкаталогах.-exec ... {} +
— для каждого найденного файла выполняем команду.sed -i '...'
— используемsed
для редактирования файлом на месте (-i
).9s/.*/.../
— заменяем строку 9 на новую.10d
— удаляем 10-ю строку.
Примечания:
- Убедитесь, что в вашем случае путь к репозиторию в URL-адресе и используемые команды
curl
иgrep
совпадают с вашими требованиями. - Проверьте результаты замены, чтобы убедиться, что все прошло гладко.
- Рекомендуется создать резервные копии файлов перед выполнением массовых замен, чтобы избежать потери данных.
Таким образом, вы сможете заменить строки 9 и 10 на нужную строку в каждом файле hello.mk
в вашей директории.