【发布时间】:2017-01-22 05:03:23
【问题描述】:
我正在尝试使用正则表达式将文件中的一些字符串替换为sed。更复杂的是,这是在 Makefile 脚本中完成的,该脚本需要同时在 osx 和 linux 上工作。
具体来说,在file.tex内我要替换
\subimport{chapters/}{xxx}
与
\subimport{chapters/}{xxx-yyy}
(xxx 和 yyy 只是示例文本。)
注意,xxx 可以包含任何字母、数字和_(下划线),但实际上正则表达式可以简单地匹配括号内的任何内容。有时\subimport...之前的行首会有一些空格。
要搜索的字符串的设计需要大量转义(当使用正则表达式搜索时),我猜其中某处是我的错误。
这是我迄今为止尝试过的:
sed -i'.bak' -e 's/\\subimport\{chapters\/\}\{xxx\}/\\subimport\{chapters\/\}\{xxx-yyy\}/g' file.tex
# the -i'.bak' is required so SED works on OSX and Linux
rm -f file.tex.bak # because of this, we have to delete the .bak files after
当我构建包含此脚本的 Makefile 时,这会导致错误 RE error: invalid repetition count(s)。
我认为我的部分问题是sed 的-E 选项在osx 版本的sed 中不可用。事实证明,当使用 -E 选项时,应该转义的东西更少(请参阅我的问题中的 cmets)。
【问题讨论】:
-
-E选项在OS X中可用,这将是 Linux 上的-r选项。 -
@l'L'l 当我使用
-E选项时,我收到not defined in the RE错误。即使它对我有用,我也无法设置 POSIX 选项,因为 OSX/BSD 以一种方式进行,而 GNU 以另一种方式进行。 -
那是因为你正在转义捕获组,使用
-E时不需要这样做(例如,而不是\( ... \),只需使用( ... )) -
如果您在
Makefile中使用sed命令并希望根据操作系统使用不同的命令,您可以始终使用类似的条件:UNAME := $(shell uname); ifeq ($(UNAME), Linux)... -
你并没有真正改变你的问题——只是更正它,这就是编辑功能的用途:) 也许只是假设你认为它在 OS X 上不可用,但要找出它确实存在。
标签: regex linux macos sed makefile