2017-10-04 42 views
1

在我們的文件結構中,我們有帶標籤的片段。從我的項目目錄中,我想根據前面一行聲明的標籤返回片段名稱,對於在項目中以.feature結尾的所有文件。將Unix grep/sed/awk轉換爲Ruby

例如,該目錄包含一個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?

+2

不錯的使用sed/awk。不確定會有像這樣的簡潔和優雅的Ruby方法。 – hedgesky

回答

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行,並且輸出中不應包含其他場景。