又一个sed需要一些逃逸foo的例子
我正在尝试使用又一个sed需要一些逃逸foo的例子,sed,makefile,Sed,Makefile,我正在尝试使用sed在makefile中编辑文件。当我编辑日期时,格式为xxxx yy zz,效果很好。当我尝试编辑x.y.z格式的版本号时,它失败了。我很确定这是因为我需要在sed的grep部分的版本中转义。我用过这个,但它不起作用,我在这方面做得不够好,弄不明白(类似的建议)。由于使用了外部文件,我无法给出一个工作示例,但以下是基本思路: SHELL := /bin/bash # bash is needed for manipulation of version number PKG_NA
sed
在makefile中编辑文件。当我编辑日期时,格式为xxxx yy zz,效果很好。当我尝试编辑x.y.z格式的版本号时,它失败了。我很确定这是因为我需要在sed
的grep部分的版本中转义
。我用过这个,但它不起作用,我在这方面做得不够好,弄不明白(类似的建议)。由于使用了外部文件,我无法给出一个工作示例,但以下是基本思路:
SHELL := /bin/bash # bash is needed for manipulation of version number
PKG_NAME=FuncMap
TODAY=$(shell date +%Y-%m-%d)
PKG_VERSION := $(shell grep -i '^version' $(PKG_NAME)/DESCRIPTION | cut -d ':' -f2 | cut -d ' ' -f2)
PKG_DATE := $(shell grep -i '^date' $(PKG_NAME)/DESCRIPTION | cut -d ':' -f2)
## Increment the z in of x.y.z
XYZ=$(subst ., , $(PKG_VERSION))
X=$(word 1, $(XYZ))
Y=$(word 2, $(XYZ))
Z=$(word 3, $(XYZ))
Z2=$$(($(Z)+1))
NEW_VERSION=$(addsuffix $(addprefix .,$(Z2)), $(addsuffix $(addprefix ., $(Y)), $(X)))
OLD_VERSION=$(echo "$(PKG_VERSION)" | sed -e 's/[]$.*[\^]/\\&/g' )
all: info update
info:
@echo "Package: " $(PKG_NAME)
@echo "Current/Pending version numbers: " $(PKG_VERSION) $(NEW_VERSION)
@echo "Old date: " $(PKG_DATE)
@echo "Today: " $(TODAY)
@echo "OLD_VERSION: " $(OLD_VERSION)
update: $(shell find $(PKG_NAME) -name "DESCRIPTION")
@echo "Editing DESCRIPTION to increment version"
$(shell sed 's/$(OLD_VERSION)/$(NEW_VERSION)/' $(PKG_NAME)/DESCRIPTION > $(PKG_NAME)/TEST)
@echo "Editing DESCRIPTION to update the date"
$(shell sed 's/$(PKG_DATE)/$(TODAY)/' $(PKG_NAME)/DESCRIPTION > $(PKG_NAME)/TEST)
这就是输出:
Package: FuncMap
Current/Pending version numbers: 1.0.1000 1.0.1001
Current date: 2000-07-99
Today: 2015-07-11
OLD_VERSION:
sed: first RE may not be empty
Editing DESCRIPTION to increment version
Editing DESCRIPTION to update the date
显然,版本号上的
sed
不起作用(日期处理得很好,当前/挂起的版本正确,并且在外部文件中正确更改了日期)。除了这个特殊的问题之外,我确信这段代码中的很多都是次优的——不要笑!我不知道make或shell脚本编写得很好…旧版
为空,因为您忽略了makefileshell
函数:
OLD_VERSION=$(shell echo "$(PKG_VERSION)" | sed -e 's/[]$.*[\^]/\\&/g' )
旧版本
应该是PKG\u版本
,但其形式(转义
?)将在规则更新中的sed
中工作。在sed
行中使用PKG_VERSION
也不能正常工作。请参阅@Ed Morton:我认为OP描述的用例实际上不需要转义任何内容。目标是在Makefileupdate
目标中使用sed
将1.0.1000
替换为1.0.1001
。因此,这应该是可行的:sed“s/$(PKG\u版本)/$(NEW\u版本)/“$(PKG\u名称)/DESCRIPTION”>“$(PKG\u名称)/TEST”
@EugeniuRosca,它可能会失败,因为
将被视为任何字符,因此,如果他的文件中碰巧有类似12031000
的内容,它将被替换为1.0.1001
。他还应该使用单词边界。@EdMorton yep。我的错。你说得对。啊,我的愚蠢(丢失的贝壳)。谢谢你在回答中的解释,非常有帮助。