Рассмотрим код:
output = `cat test.txt`
puts output # /^\\([0-3][0-9]\\/[0-1][0-9]\\/[2-9][0-9]{3}\\)$/
str = 'test ' + output
puts str # test /^\\([0-3][0-9]\\/[0-1][0-9]\\/[2-9][0-9]{3}\\)$/
new_str = 'new test ' + output
puts new_str # new test /^\\([0-3][0-9]\\/[0-1][0-9]\\/[2-9][0-9]{3}\\)$/
res = str.sub('test', 'new test')
puts res # new test /^\\([0-3][0-9]\\/[0-1][0-9]\\/[2-9][0-9]{3}\\)$/ <-- all fine
res = str.sub(str, new_str)
puts res # new test /^\([0-3][0-9]\/[0-1][0-9]\/[2-9][0-9]{3}\)$/ <-- !!! problem
код только для того, чтобы представить проблему, которая у меня есть;)
Проблема: У меня есть текст замены с двойной обратной косой чертой, который мне нужно записать "как есть" в другой файл
Вопрос : есть ли какой-нибудь простой метод замены, который не интерпретирует обратную косую черту (возможно, какой-то двоичный режим)?
Потому что довольно странно делать так: res = str.sub(str, new_str.gsub('\\', '\\\\\\\\'))
, хотя это работает ...
реальный рабочий код:
file = 'some/random/file.php'
contents = new_contents = ''
File.open(file, 'rb') do |f|
contents = new_contents = f.read
end
contents.scan(/('([A-Z]+)' \=\> \<\<\<'JSON'(.*?)JSON)/m) do |match|
Dir.glob("*#{match[1]}.json") do |filename|
compressed = `../compress.py #{filename}`.gsub('\\', '\\\\\\\\')
replacement = match[0].sub(match[2], "\n" + compressed).force_encoding('ASCII-8BIT')
new_contents = new_contents.sub(match[0], replacement.gsub('\\', '\\\\\\\\'))
end
end
File.open(file, 'wb') do |f|
f.write(new_contents)
end