8

我在 Windows 中有这个命令行输入:

dir /b | ruby -ne 'f=$_.chomp;File.read(f).each_line{|line| print f if line =~ /helloworld/};'

这一行是查找当前目录下的所有文件helloworld。(我知道还有很多其他方法可以做到这一点,但这篇文章并没有关注那个)

我的问题是:

这一行给出了错误说法line is not a valid command。然后我意识到|在 Ruby 中作为块变量的大括号是 cmd 中的管道符号。我试图将整行更改为双引号并转义 | 签名但没有成功。我怎样才能逃脱竖线|?

请不要回答其他方法来完成任务,例如使用 grep、find、sed 或 awk 等其他工具,或将块更改为 for 循环。

4

2 回答 2

12

我找到了这个 microsoft.com 页面,其中包含以下有关管道和特殊字符的内容:

与号 (&)、竖线 (|) 和圆括号 ( ) 是特殊字符,当您将它们作为参数传递时,必须在它们前面加上转义字符 (^) 或引号。

于 2012-09-28T19:17:10.257 回答
2

单引号似乎是你的问题。请改用双引号,因为它们是 Windows 所必需的(尽管 Unix 也可以理解)。

这在 Windows 中对我有用:

C:\tmp\ruby>echo helloworld > foo.txt

C:\tmp\ruby>dir /b | ruby -ne "f=$_.chomp;File.read(f).each_line{|line| print f if line =~ /helloworld/};"
foo.txt

我知道您提到您尝试过双引号,但是如果您粘贴实际尝试过的内容,我可以查看是否有其他问题。

于 2012-09-28T20:22:17.577 回答