又一个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脚本编写得很好…

旧版
为空,因为您忽略了makefile
shell
函数:

OLD_VERSION=$(shell echo "$(PKG_VERSION)" | sed -e 's/[]$.*[\^]/\\&/g' )

旧版本
应该是
PKG\u版本
,但其形式(转义
?)将在规则
更新中的
sed
中工作。在
sed
行中使用
PKG_VERSION
也不能正常工作。请参阅@Ed Morton:我认为OP描述的用例实际上不需要转义任何内容。目标是在Makefile
update
目标中使用
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。我的错。你说得对。啊,我的愚蠢(丢失的贝壳)。谢谢你在回答中的解释,非常有帮助。