预处理器包含文件

时间:2012-01-21 11:07:40

标签: ruby command-line gsub

在Ruby中实现文件包含的简单方法是什么,例如如果文本文件包含{{{stuff.txt}}},则stuff.txt的内容将包含在内。我想也许是这样的:

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

...涉及到eval(),但无法使其正常工作。

2 个答案:

答案 0 :(得分:2)

s.gsub(/{{{(.+?)}}}/) { |m| File.read($1) }

几点:

  • 。+和。+?之间有一个重要的区别。使用。+,很容易制作吃掉太多字符的正则表达式。
  • 您需要使用块来计算替换(因为它是动态的)

答案 1 :(得分:1)

如果您想直接从命令行执行此操作,请尝试

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

正如Alex D所指出的那样,.+是贪婪的并且尽可能多地匹配角色。另一方面,.+?尝试匹配为少数字符。

Ruby的命令行-p希望您更新$_变量的值。因此使用变异gsub!而不是gsub来制作副本。使用-n可以获得相同的结果。

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