fork(8) download
  1. input = c("XX-XXZZXX-XZXXXXX", "XX-XXXZXXZXZXXX", "XXXXXZXXXZXXZX-X",
  2. "XXXZXXXZXZXZXXX", "XZXXX-XXXZXZXXX", "XX-XXX-ZZX", "XXZX-XXZXXX-XZ",
  3. "XZXZXX-XXZXXZXX")
  4. gsub("(?:^([^Z]*Z){2}|(?!^)\\G)[^-]*\\K-", "Z", input, perl=T)
  5.  
Success #stdin #stdout 0.46s 79168KB
stdin
Standard input is empty
stdout
[1] "XX-XXZZXXZXZXXXXX" "XX-XXXZXXZXZXXX"   "XXXXXZXXXZXXZXZX" 
[4] "XXXZXXXZXZXZXXX"   "XZXXX-XXXZXZXXX"   "XX-XXX-ZZX"       
[7] "XXZX-XXZXXXZXZ"    "XZXZXXZXXZXXZXX"