Skip to contents

Search across files for lines matching a regular expression

Usage

find_in_files(
  pattern,
  path = ".",
  recursive = TRUE,
  filename_pattern = "\\.R$|\\.r$",
  full.names = TRUE,
  ignorecomments = FALSE,
  ignore.case = TRUE,
  whole_line = TRUE,
  quiet = FALSE
)

Arguments

pattern

regular expression to look for

path

can be e.g., "./R" or "./tests/testthat" or "."

recursive

if TRUE, search includes subfolders (passed to list.files())

filename_pattern

default is R code files only! A regular expression that would limit file names to search

full.names

if TRUE, returns paths not just filenames (passed to list.files())

ignorecomments

omit hits from commented out lines

ignore.case

as in grep

whole_line

set it to FALSE to see only the matching fragments vs entire line of text that has a match in it

quiet

whether to print results or just invisibly return

Value

a list of named vectors, where names are file paths with hits, elements are vectors of text with hits.

Examples

EJAM:::find_in_files("[^_]logo_....",    path = "./R", whole_line = FALSE)
EJAM:::find_in_files("report_logo.....", path = "./R", whole_line = FALSE)
EJAM:::find_in_files("app_logo......",   path = "./R", whole_line = FALSE)

EJAM:::find_in_files("latlon_from_.{18}",    whole_line = FALSE)
EJAM:::find_in_files("latlon_from_s.{9}",    whole_line = FALSE)
EJAM:::find_in_files("latlon_from_mact.{9}", whole_line = FALSE)

## useful reminders of how to filter lines of code vs comments when using find_in_files()

grepl_line_not_commented_out = "^[ ]*[^# ]+.*"
# line starts with zero or more spaces followed by a non-space non-# character

grepl_line_commented_out     = "^[ |#]*#.*"
# line starts with zero or more spaces and then a hash mark

grepl_line_may_have_comment  = "#.*"
# line contains a hash mark somewhere

grepl(grepl_line_may_have_comment, " print('The # of people is 4.')")
# TRUE even though there is no comment here
grepl(grepl_line_may_have_comment, " # print('The number of people is 4.')")
grepl(grepl_line_may_have_comment,
  "   print('The number of people is 4.')   # a comment only after the code")

EJAM:::find_in_files(paste0(grepl_line_not_commented_out, "xxx"))
EJAM:::find_in_files(paste0(grepl_line_commented_out,     "xxx"))
EJAM:::find_in_files(paste0(grepl_line_may_have_comment,  "xxx"))