Препроцессор для включения файла - PullRequest
1 голос
/ 21 января 2012

Какой простой способ реализовать включение файлов в Ruby, например, если текстовый файл содержит {{{stuff.txt}}}, содержимое stuff.txt включается в строку.Я подумал, может быть, что-то вроде этого:

cat prog | ruby -pe 'gsub /{{{.+}}}/, File.open("$0").read'

... с включенным eval (), но не могу заставить его работать.

Ответы [ 2 ]

2 голосов
/ 21 января 2012
s.gsub(/{{{(.+?)}}}/) { |m| File.read($1) }

Пара очков:

  • Существует важное различие между. + И. + ?. Используя. +, Легко создавать регулярные выражения, которые потребляют слишком много символов.
  • Вам нужно использовать блок для расчета замены (поскольку он динамический)
1 голос
/ 21 января 2012

Если вы хотите сделать это прямо из командной строки, попробуйте

cat prog | ruby -pe '$_.gsub!(/{{{(.+?)}}}/) { File.read $1 }'

Как указывает Алекс Д, .+ является жадным и соответствует как можно большему числу символов.С другой стороны, .+? пытается найти как несколько символов, насколько это возможно.

В командной строке Ruby -p ожидается, что вы обновите значение переменной $_.Следовательно использование мутации gsub! вместо gsub, которая делает копию.Тот же результат может быть достигнут при использовании -n.

cat prog |  ruby -ne 'puts $_.gsub(/{{{(.+?)}}}/) {  File.read $1 }'
...