2016-11-27 75 views
-1

尋找紅寶石一個內襯替代打印出只有在訂單正則表達式匹配的替代:紅寶石一個襯墊僅更換匹配的行,丟棄他人

echo -e "Line 1\nLine 2\nLine 3" | perl -ne "print if s/Line 2/Line 2 replaced, others discarded/g"

輸入:

Line 1 
Line 2 
Line 3 

輸出:

Line 2 replaced, others discarded 
+0

'string.scan(/ ^線2 $ /)地圖{|。X | x.gsub(/ 2 /,「2替換,其他丟棄」)} .join(「\ n」)' –

+1

'Line 2'是否等於整行?你的Perl例子不檢查行位置的開始/結束。 'Line 1 \ nLine 2 Line 2 \ nLine 3 Line 2''的預期輸出是什麼? –

+0

@WiktorStribiżew,我不在乎線的開始/結束。這只是一個例子。我只是在Ruby中尋找配方。正則表達式本身並不重要。不過謝謝你的關心。 –

回答

1

據我所知,有在紅寶石中是不等於-ne的簡寫。因此,這將是更長一點:

echo -e "Line 1\nLine 2\nLine 3" | ruby -e 'puts $<.read.lines.map {|l| l =~ /Line 2/ ? l.gsub(/Line 2/, "Line 2 replaced, others discarded") : nil }.compact' 

其中:

  • $<ARGFdocs)是流文件參數或STDIO
  • $<.read將它所有的讀取字符串
  • $<.read.lines分裂由新行字符返回數組
  • map {|l| ... }將收集表達式的結果到新陣列塊
  • l =~ /Line 2/如果檢查字符串匹配的正則表達式
  • l.gsub(/Line 2/, "Line 2 replaced")將取代所有的「2號線」到「2號線改爲」
  • .compact將從數組中刪除nil值(返回新的數組不爲零的)
  • puts []將打印數組中的每個元素的新線

可能紅寶石是不是這個任務的最佳選擇,我會選擇sed或做它在文本編輯器。大多數文本編輯器中可以找到和正則表達式替換nowdays

+0

我接受你的答案,因爲它符合法案。我現在可以用ruby替換我的perl一個班輪,因爲perl在處理多字節unicode字符時遇到問題。 Ruby和Python沒有這些問題,但缺少實用的「-ne」功能。我懷疑沒有「-ne」存在,因爲我在網上搜索了沒有vail,但我很高興你證實了我的這一點,並且仍然向我展示了一個簡單的,單線的解決方案。如果你覺得這是值得的,請投票給我的問題,以抵消那些投下了它的人(我的問題有什麼問題???) –