我发现 CMake 并没有按照我预期的方式执行 RegEx。显然,其他人也遇到了同样的问题。 https://cmake.org/pipermail/cmake/2007-October/017107.html问题是 CMake 不是基于行的。当您使用^
or the $
运算符,它们针对整个字符串,而不是行的开头和结尾。
我正在尝试删除文件中的所有行#include <blah.h>
or #include "blah.h"
.
为此,我创建了一个小函数:
function(deleteinplace IN_FILE pattern)
file(READ ${IN_FILE} CONTENTS)
string(REGEX REPLACE ${pattern} "" STRIPPED ${CONTENTS})
file(WRITE ${IN_FILE} "${STRIPPED}")
endfunction()
然后调用它:
deleteinplace(myfile.h "\#include.*\n")
这最终会在字符串匹配后删除文件中的所有内容。
非贪婪技巧如.*?
由于某种原因不能在 CMake 中工作。其他技巧如\r?\n
也不行。
我需要解决这个问题。
诀窍是not to use file(READ ...)
, but file(STRINGS ....)
。这会让CMake
逐行读取文件,并返回代表一行的字符串列表,完全按照您的需要。使用这种方法,您的函数将如下所示:
function(deleteinplace IN_FILE pattern)
# create list of lines form the contens of a file
file (STRINGS ${IN_FILE} LINES)
# overwrite the file....
file(WRITE ${IN_FILE} "")
# loop through the lines,
# remove unwanted parts
# and write the (changed) line ...
foreach(LINE IN LISTS LINES)
string(REGEX REPLACE ${pattern} "" STRIPPED "${LINE}")
file(APPEND ${IN_FILE} "${STRIPPED}\n")
endforeach()
endfunction()
然后调用它:
deleteinplace(myfile.h "\#include.*")
请注意,在此示例中\n
作为一部分自动从行中剥离file(STRINGS ....)
声明,并添加回file(APPEND ....)
陈述;所以,\n
调用该函数时也从搜索模式中删除。
最后,这是有关的文档文件(字符串...) https://cmake.org/cmake/help/v3.16/command/file.html#strings
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)