【问题标题】:Converting Unix grep/sed/awk into Ruby将 Unix grep/sed/awk 转换为 Ruby
【发布时间】:2017-10-05 06:33:00
【问题描述】:

在我们的文件结构中,我们有带有标签的 sn-ps。在我的项目目录中,我想根据上一行声明的标签返回项目中所有以.feature结尾的文件的sn-p名称。

例如,该目录包含一个带有以下文本的login.feature 文件:

@integration @unit @smoke
Scenario: Login to Product

@integration @unit
Scenario: Buy Stuff

该目录还包含一个带有以下文本的logout.feature 文件:

@test @wip @smoke
Scenario: Logout of Product

我想运行一个返回以下数组的命令:

["Login to Product", "Logout of Product"]

如你所见,我基本上是在做以下事情:

grep -inr -A 1 '@smoke' ./my/directory | grep Scenario | sed -n -e 's/^.*Scenario: //p' | awk '!seen[$0]++'

...除了将结果行转换为数组。

在 Ruby 中是否有一种优雅的方法可以做到这一点?或者我能以某种方式将 Unix 魔法与 Ruby 糖结合起来吗?还是我应该坚持使用 sed/awk/grep?

【问题讨论】:

  • 很好地使用 sed/awk。不确定是否会有像这个一样简洁优雅的 Ruby 方法。

标签: ruby-on-rails ruby bash unix


【解决方案1】:

这就是我的想法

results = []
Dir.glob("#{folder}/**/*.feature").each do |file|
  i = 0; line = nil
  File.foreach(file).map{ |l| line = i+1 if l[/@smoke/]; i+=1 }
  results << IO.readlines(file)[line].gsub(/Scenario:\s|\n/,'') unless line.nil?
end

p results

结果:

["Login to Product", "Logout of Product"]

您可以轻松地将其转换为方法。

编辑:在重新检查您的完整命令行后更新了此内容。看起来您只想要 Scenario 出现在 @smoke 行之后,并且输出中不应包含其他场景。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-09-22
    • 1970-01-01
    • 1970-01-01
    • 2017-08-28
    • 2022-01-03
    • 2015-12-29
    • 1970-01-01
    • 2017-09-29
    相关资源
    最近更新 更多