To get the text inside the last set of [...] brackets, you may use a sub with the following pattern:
".*\\[([^][]+)].*"
The pattern matches:
.* - any 0+ chars greedily, as many as possible, up to the last occurrence of the subsequent subpatterns
\\[ - a literal [ (must be escaped outside of the bracket expression)
([^][]+) - Group 1 (later referred to with \1) matching 1 or more chars other than ] and [
] - a literal ] (no need escaping it outside of a bracket expression
.* - the rest of the string.
R online demo:
x <- c("[ghjg6] [fdg5] [113gi4lki] great work", "[xzswedc: acf] [xzt8] [111eerrh5]", "[asd2] [1] [113vu17hg 115er5lgr 112cgnmbh ] get out", "Some text with no brackets")
df <- data.frame(x)
df$x = sub(".*\\[([^][]+)].*", "\\1", df$x)
df
Output:
x
1 113gi4lki
2 111eerrh5
3 113vu17hg 115er5lgr 112cgnmbh
4 Some text with no brackets
If you want to remove the entries with no [...] (like the last one in my test set), use
df$x = sub(".*\\[([^][]+)].*|.*", "\\1", df$x)
See another online R demo.