Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Groovy: Idiomatic way to replace captured groups

I've a string like this: docker login -u username -p password docker-registry-url.

I execute the command in a Groovy script with execute. For debugging purposes, I print the command before execution, but since it contains sensitive data, I obfuscate the username and password.

def printableCmd = cmd.toString()

def m = printableCmd =~ /(?:.+) -u (.+) -p (.+) (?:.+)/

if (m.matches() && m[0].size() >= 3) {
  printableCmd = m[0][-1..-2].inject(m[0][0]) { acc, val -> acc.replaceAll(val, "***") }
}

The above works as expected and prints docker login -u *** -p *** docker-registry-url, but I'm wondering if there is a more idiomatic way to do this. Note that I don't want to delete the captured groups, just replace them with asterisks, thus making it very clear that the command is not wrong, but obfuscated for security purposes.

like image 705
Abhijit Sarkar Avatar asked Aug 03 '17 02:08

Abhijit Sarkar


2 Answers

def cmd='docker login -u username -p password docker-registry-url'
println cmd.replaceAll(/(\s-[up]\s+)(\S+)/,'$1***')

Output:

docker login -u *** -p *** docker-registry-url
like image 108
daggett Avatar answered Oct 01 '22 06:10

daggett


I found the following solution myself using positive look-behind:

​def cmd = "docker login -u username -p password docker-registry-url"
println cmd.replaceAll(/(?<=-[up]\s)(\S+)/,"***")
like image 23
Abhijit Sarkar Avatar answered Oct 01 '22 05:10

Abhijit Sarkar