删除带前缀的前缀

问题描述 投票:31回答:3

是否可以从make中的字符串(在我的情况下为路径名)中删除前缀?

作为示例,假设我有字符串:

FILES = a/b/c.d a/b/e.f

我想删除a/,并留下b/c.d b/e.f

我曾尝试使用dir中的notdirbasenameGNU make manual的各种组合,但似乎没有一个提供好的解决方案。

$(dir $(FILE))      # a/b a/b
$(notdir $(FILE))   # c.d e.f
$(basename $(FILE)) # a/b/c a/b/e

到目前为止,我发现这样做的唯一方法是:

$( join $(basename $(dir $(FILE))), $(notdir $(FILE)) )

这真是丑陋而漫长。我真正需要的是某种$(removeprefix ...)功能。假设我知道要删除的前缀(a/),可以通过某种字符串操作来完成吗?

makefile gnu-make
3个回答
59
投票

您可以使用以下命令剥离开头的a/

$(FILE:a/%=%)

请参阅text substitution function reference了解更多选项和详细信息。


18
投票

由于您说了GNU make,为什么不这样:

$(FILE:a/%=%)


-1
投票

您应该尝试

$(patsubst a/%,%,$(FILE))

根据GNU make Wiki:link

$(patsubst pattern,replacement,text)

在文本中的

查找用空格分隔单词与模式匹配,并将其替换为替换。此处的模式可能包含一个用作通配符的“%”,匹配单词中任意数量的任何字符。 如果替换也包含'%',则将'%'替换为与'%'模式匹配的文本。这样,仅处理模式和替换中的第一个“%”;随后的所有“%”均保持不变。

patsubst函数调用中的

'%'个字符可以用前面的反斜杠('\')引起来。否则会引用“%”字符的反斜杠可以使用更多的反斜杠进行引用。在比较文件名或将词干替换为模式之前,将从模式中删除引用“%”字符或其他反斜杠的反斜杠。没有引号'%'的危险的反斜杠不会被删除。例如,模式'\%weird \%pattern \在运算符'%'字符之前具有'the%weird \',在其后是'pattern \'。最后两个反斜杠不受影响,因为它们不会影响任何'%'字符。

单词之间的空格被折叠成单个空格字符;前导和尾随空白将被丢弃。

© www.soinside.com 2019 - 2024. All rights reserved.