【问题标题】:Yet another example of sed needing some escape foo另一个需要逃逸 foo 的 sed 示例
【发布时间】: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 目标中使用 sed1.0.1000 替换为 1.0.1001。所以,这应该工作:sed "s/$(PKG_VERSION)/$(NEW_VERSION)/" "$(PKG_NAME)/DESCRIPTION" > "$(PKG_NAME)/TEST"
  • @EugeniuRosca 可能会失败,因为. 将被视为任何字符,因此如果他的文件中碰巧有12031000 之类的东西,它将被1.0.1001 替换。他也应该使用单词边界。
  • @EdMorton 是的。我的错。你是对的。

标签: sed makefile


【解决方案1】:

OLD_VERSION 为空,因为您省略了 makefile shell 函数:

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

【讨论】:

  • 啊,我的愚蠢(丢失的外壳)。感谢您在回答中的解释,非常有帮助。
猜你喜欢
  • 1970-01-01
  • 2015-06-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多