如何在ruby中使用regex选项运行find shell命令

时间:2015-09-07 19:42:30

标签: ruby regex linux shell

我需要在ruby脚本中使用regex选项运行Linux find命令,但它似乎不起作用。所有命令都是查找扩展名为rb或erb或js的文件。我知道命令本身很好,因为我可以在命令提示符窗口中运行它。

以下是我要运行的find命令:

find . -regex ".*\.\(rb\|erb\|js\)"

这是我的ruby脚本的样子:

#!/usr/bin/env ruby
files = `find . -regex ".*\.\(rb\|erb\|js\)"`
puts files

我知道我可以使用-name选项而不是正则表达式,但似乎正则表达式应该可行。此外,我能够在我的ruby脚本中使用命令find . -regex ".*\.rb"。它似乎几乎与括号或管道有问题?

任何建议/帮助将不胜感激。谢谢!

2 个答案:

答案 0 :(得分:1)

来自stribizhev's comment的猜测是正确的:向后引号中的命令文字与双引号(")中的字符串文字相同,具有相同的转义和替换/字符串插值规则。

单引号中的字符串文字(')按字面意思保留,因此以下内容应该无需双重逃避头痛:

#!/usr/bin/env ruby
command = 'find . -regex ".*\.\(rb\|erb\|js\)"'
files = `#{command}`
puts files 

答案 1 :(得分:0)

Ruby具有shellescape https://apidock.com/ruby/String/shellescape,可让您显式转义要传递给Unix样式shell的参数。您的示例可能写为

`find . -regex #{Shellwords.shellescape ".*\.\(rb\|erb\|js\)"}`