This is the color-aware counterpart of base::substring(). It works exactly like the original, but keeps the colors in the substrings. The ANSI escape sequences are ignored when calculating the positions within the string.

ansi_substring(text, first, last = 1000000L)



Character vector, potentially ANSI styled, or a vector to coerced to character. It is recycled to the longest of first and last.


Starting index or indices, recycled to match the length of x.


Ending index or indices, recycled to match the length of x.


Character vector of the same length as x, containing the requested substrings. ANSI styles are retained.

See also


str <- paste(

cat(str, "\n")
#> red default green 
cat(ansi_substring(str, 1, 5), "\n")
#> red d 
cat(ansi_substring(str, 1, 15), "\n")
#> red default gre 
cat(ansi_substring(str, 3, 7), "\n")
#> d def 

substring(ansi_strip(str), 1, 5)
#> [1] "red d"
substring(ansi_strip(str), 1, 15)
#> [1] "red default gre"
substring(ansi_strip(str), 3, 7)
#> [1] "d def"

str2 <- paste(
  col_red("multi-", style_underline("style")),

cat(str2, "\n")
#> another multi-style text 
cat(ansi_substring(str2, c(3,5), c(7, 18)), sep = "\n")
#> other
#> her multi-styl
substring(ansi_strip(str2), c(3,5), c(7, 18))
#> [1] "other"          "her multi-styl"