首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >函数"filter“和"filter-out”不移除换行符。

函数"filter“和"filter-out”不移除换行符。
EN

Stack Overflow用户
提问于 2015-08-21 08:57:00
回答 1查看 19.8K关注 0票数 0

来自https://www.gnu.org/software/make/manual/html_node/Text-Functions.html#Text-Functions

$(filter PATTERN...,TEXT)返回与任何模式词匹配的文本中所有空格分隔的单词,删除所有不匹配的单词。这些模式是使用%编写的,就像上面的patsubst函数中使用的模式一样。

$(filter-out PATTERN...,TEXT)

返回不匹配任何模式词的文本中所有空格分隔的单词,删除与一个或多个匹配的单词。这与filter函数正好相反。

空格-分隔词”是什么意思?

我们想我们知道了。至少,假设一个“正常”的地区。

因此,对于"C“("POSIX")区域设置我们有

“空间”

将要分类的字符定义为空白字符。

在POSIX中,至少应包括<space><form-feed><newline><carriage-return><tab><vertical-tab>

Now,一个makefile,如下所示:

代码语言:javascript
复制
define foo
a
b
endef


all :
    echo '$(filter a b,$(foo))'

运行,我得到:

代码语言:javascript
复制
echo ''

让我们来看看filter-out 的案例:

代码语言:javascript
复制
define foo
a
b
endef


all :
    -echo '$(filter-out a b,$(foo))'

运行,我得到:

代码语言:javascript
复制
echo 'a
/bin/sh: 1: Syntax error: Unterminated quoted string
makefile:8: recipe for target 'all' failed
make: [all] Error 2 (ignored)
b'
/bin/sh: 1: Syntax error: Unterminated quoted string
makefile:8: recipe for target 'all' failed
make: [all] Error 2 (ignored)

因此,在这里,Make显然不能正确处理合法的white-space (换行符)。

对吗?

EN

回答 1

Stack Overflow用户

发布于 2015-08-21 15:08:10

问题是,您需要转义foo变量中的换行符,或者将其值传递到适当的位置。

与在makefile中编写任何嵌入式shell脚本一样,您需要转义每一行新代码。$(foo)将简单地从foo多行变量复制粘贴内容。因此,对于给定的foo值,下面的菜谱将引发语法错误:

代码语言:javascript
复制
test1:
    echo '$(foo)'

类似的事情也适用于您的filter-out示例。我不知道为什么filter函数没有语法错误。

1解决方案。如上所述,转义换行符是解决方案之一:

代码语言:javascript
复制
define foo
a\
b
endef

test1:
    echo '$(foo)'

好处是你不需要改变你的all配方。

第二个解决方案。在大多数情况下,您可能不想更改/编辑/解析多行变量。然后,您需要使用一个shell函数,它将直接调用一个shell命令,而不是将脚本粘贴到makefile内容中,然后解析它。我们的测试配方如下所示:

代码语言:javascript
复制
define foo
a
b
endef

test2:
    echo $(shell echo '$(foo)')

注意,函数正在将输出换行符转换为单个空格。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32136288

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档