r语言 - 查找和/或替换不在注释行的



我使用的是Rstudio 1.4.1106,我们都知道我们可以使用Ctrl + F来查找或替换。通常,Rstudio会在任何一行代码中查找/替换,包括注释行(以#开头的行)。我希望只在(实际的)命令行中查找/替换(实际做某事的命令,即使该行末尾可能有#用于注释)。

你有什么解决办法吗?

您可以使用正则表达式查找并忽略以注释符号开头的行。例如,您可以输入(?<!#.*)bsearchStringb来忽略以#开头的行中的匹配内容。

这基本上是为#做一个消极的向后看,以确保它不匹配之前有一个#的searchString,向后看中的量词确保我们排除像# some things searchString这样的东西。这对于正则表达式来说不是很理想,在一些不允许非固定宽度的语言中可能不起作用,但它在rstudio中的查找和替换正则表达式中起作用,因此应该服务于OP的目的。让我知道,如果有任何边缘情况,这个正则表达式是缺失的。

在尝试之前不要忘记勾选正则表达式框!

你可以写一个R函数,只在非注释区域修改文件:

library(tidyverse)
file_replace <- function(file, ...) {
file %>%
read_lines() %>%
map_chr(function(l) {
if(l %>% str_starts("#")) {
# comment 
l
} else {
# code
parts <- l %>% str_split("#") %>% simplify()

if(length(parts) == 2) {
# code line contains comment
paste0(
parts[[1]] %>% str_replace_all(...),
"#",
parts[[2]]
)
} else {
l %>% str_replace_all(...)
}
}
}) %>%
write_lines(file)
}

输入文件foo.R:

#' foo
#' @param foo: number to increase
f <- function(foo) {
foo + 1 # increasing the foo
}

执行替换:

file_replace("foo.R", pattern = "f[o]{2}", replacement = "bar")

替换后的输出文件foo.R:

#' foo
#' @param foo: number to increase
f <- function(bar) {
bar + 1 # increasing the foo
}

这个例子也说明了这种方法的危险:这样做,您不会更新作为注释一部分的文档字符串!

最新更新