É um problema de citação. Você está usando aspas duplas para a variável $f , mas as aspas duplas também têm outras implicações. Em particular, eles permitem o escape de caracteres em barra invertida, portanto, \ se torna \ quando atinge Perl:
$ printf "%s\n" "print if s/(\label\{.*?)\}/_$f\}/g"
print if s/(\label\{.*?)\}/_\}/g
Isso cria um problema com r , porque \r será visto como o caractere de retorno (consulte perlrebackslash ) - não corresponderá a r . Use aspas simples, abrindo apenas para a variável:
$ printf "%s\n" 'print if s/(\label\{.*?)\}/_'"$f"'\}/g'
print if s/(\label\{.*?)\}/_\}/g