【发布时间】:2015-09-30 12:46:27
【问题描述】:
我正在尝试使用sed 编辑生成文件中的文件。当我以 xxxx-yy-zz 格式编辑日期时,它可以正常工作。当我尝试编辑格式为 x.y.z 的版本号时,它会失败。我很确定这是因为我需要在sed 的grep 部分的版本中转义.。我使用了这个answer,但它不起作用,而且我在这方面还不够好,无法弄清楚(类似的建议here)。由于使用了外部文件,我无法给出一个工作示例,但这是基本思想:
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 脚本...
【问题讨论】:
-
OLD_VERSION应该是PKG_VERSION,但形式(转义.?)将在规则update中的sed中工作。在sed行中使用PKG_VERSION也无法正常工作。 -
@Ed Morton:我不认为 OP 描述的用例实际上需要转义任何东西。目标是在 Makefile
update目标中使用sed将1.0.1000替换为1.0.1001。所以,这应该工作:sed "s/$(PKG_VERSION)/$(NEW_VERSION)/" "$(PKG_NAME)/DESCRIPTION" > "$(PKG_NAME)/TEST" -
@EugeniuRosca 可能会失败,因为
.将被视为任何字符,因此如果他的文件中碰巧有12031000之类的东西,它将被1.0.1001替换。他也应该使用单词边界。 -
@EdMorton 是的。我的错。你是对的。