Я полагаю, вы решаете следующую проблему:
"\\n".gsub(/\\\\/, "\\").gsub(/\\n/, "\n") # => "n"
"\\n".gsub(/\\n/, "\n").gsub(/\\\\/, "\\") # => "\\\n"
String#gsub
может принимать аргумент блока, который выполняет подстановку.
str.gsub(/\\(.)/) do |s|
case $1
when "n"
"\n"
when "t"
"\t"
else
$1
end
end
Таким образом, никакая специальная escape-последовательность не подставляется первой, и все работает как ожидалось.