LINUX.ORG.RU

Правильное использование sed !!!!!

 ,


0

1

Вообщем ситуация следующая, хочу с помощью утилиты sed произвести замену строки в файле *.h :

T="${PROJECT_DIR}/WashPay-04/INC/tempfile.h"
cat "${VER_H}" | sed 's/#define BUILD_NUMBER .*/#define BUILD_NUMBER ${BUILD_NUMBER}/g' > "${T}"
mv "${T}" "${VER_H}"

Целью всего действия имеется автоматическое проставление версии программного обеспечения в заголовочном файле. Проблема в том что неообходимо заменять любую изи строк типа:

#define BUILD_NUMBER 345345
#define BUILD_NUMBER 5
#define BUILD_NUMBER 456
#define BUILD_NUMBER 4565
#define BUILD_NUMBER 76678

Подскажите как правильно выполнить эту команду, а то у меня получается что выводится

#define BUILD_NUMBER ${BUILD_NUMBER}
вместо
#define BUILD_NUMBER 7
, то есть скрипт не видит в качестве параметра ${BUILD_NUMBER} ???????



Последнее исправление: redradist (всего исправлений: 4)

Одинарные кавычки замени на двойные. В одинарных escape-последовательности, переменные и регулярные выражения не обрабатываются.

И оформи ОП как полагается, не зря ссылка на описание разметки находится выше кнопки отправки сообщения.

r3lgar ★★★★★
()
Последнее исправление: r3lgar (всего исправлений: 1)

В новых версиях coreutils не работает.

anonymous
()

Стало очень любопытно, чем с т.з. трудоемкости отличается ручная замена чисел в заголовочном файле от ручной замены чисел в скрипте, который потом будет менять их в заголовочном файле.

thesis ★★★★★
()

BUILD_NUMBER=0.00.1a echo «#define BUILD_NUMBER $BUILD_NUMBER» > build.h

exception13 ★★★★★
()
Последнее исправление: exception13 (всего исправлений: 1)
Ответ на: комментарий от thesis

номер билда может формироваться из версии, текущей ветки/ревизии или даты

exception13 ★★★★★
()
Последнее исправление: exception13 (всего исправлений: 1)
Ответ на: комментарий от thesis

Ручное прописывание версии это отстой !!!!!! Мажорную минорную версии можно задавать и руками, или настроить при определенном количестве коммитов увелитчение минорной версии, а вот мажорную ставить руками, если много вносится изменений в софт то каждый раз менять местами числа в хидере неудобно, проще автоматизировать и тогда новые версии точно будут отличаться и заказчик точнее сможет описать в какой версии какие баги и т.д.

redradist
() автор топика
Ответ на: комментарий от r3lgar

Спасибо, помогло !!!!! Но не подскажите может данную операцию можно произвести и без tempfile-а ????? Я просто еще не до конца изучил мануал по команде sed ... Да и не все там тривиально )

redradist
() автор топика
Ответ на: комментарий от redradist

замена ненужна тебе. о сборке/версии инфу пили в генерируемый при сборке хидер.

exception13 ★★★★★
()

Такие вещи вообще-то в Makefile обычно задаются и через флаг -D компилятора пользуются.

Убирай из всех *.h #define BULD_NUMBER ... и в Makefile напиши

BUILD_NUMBER = 1234
...
CFLAGS += -DBUILD_NUMBER=$(BUILD_NUMBER)
или
CFLAGS += -DBUILD_NUMBER="\"$(BUILD_NUMBER)\""
если BUILD_NUMBER в коде это строка, например, а не циферка

Stanson ★★★★★
()

Правильное использование sed !!!!!

sed 's/!\+//'
KennyMinigun ★★★★★
()

Кстати, ТС, если используешь CMake, то там есть нужная тебе фича: http://www.cmake.org/cmake/help/v3.2/command/configure_file.html

set(BUILD_NUMBER ${YOUR_VALUE});

#cmakedefine BUILD_NUMBER @BUILD_NUMBER@

А если не иcпользуешь — пора бы начать ;)

KennyMinigun ★★★★★
()
Последнее исправление: KennyMinigun (всего исправлений: 4)
Ответ на: комментарий от r3lgar

В одинарных escape-последовательности, переменные и регулярные выражения не обрабатываются.
регулярные выражения

Ты уточняй, что регулярные выражения bash'а, а не sed'а. Но если нет bash-переменных, общая рекомендация - использовать именно одинарные кавычки, чтобы не мучаться с экранированием.

Kroz ★★★★★
()
Последнее исправление: Kroz (всего исправлений: 1)
Ответ на: комментарий от Kroz

регулярные выражения bash'а, а не sed'а

Пардон. Подумал, но не написал.

общая рекомендация - использовать именно одинарные кавычки, чтобы не мучаться с экранированием

У меня zsh, я уже привык экранировать всё, отличное от букв и цифр, но ТС — новичок, ему замечание пригодится.

r3lgar ★★★★★
()

Да все просто, у тебя недостаточно восклицательных знаков в команде, нужно больше.

Kiborg ★★★
()

Чудо, ты одинарные кавычки поставил, в них переменные не раскрываются. Если для тебя это будет открытием, то переменные раскрывает баш. Почитай его ман.

tiandrey ★★★★★
()
Ответ на: комментарий от redradist

Зачем ставить по 5 знаков препинания подряд?

nexfwall ★★★★
()

И да, не проще ли так?

sed -i "s/#define BUILD_NUMBER .*/#define BUILD_NUMBER ${BUILD_NUMBER}/g" "${VER_H}"

nexfwall ★★★★
()
Последнее исправление: nexfwall (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.