2013-10-25 40 views
0

我有一個文本文件,其中包含以下內容。紅寶石一條線可以匹配多行

one two three 
four five six 
seven eight nine 
ten eleven twelve 

我想下面的Ruby代碼轉換爲Ruby的一個襯墊命令它代替兩行(三四五六七八九)與空的空間。

input = File.new('./test', 'r+') 
content = input.read 
input.close 

modified = content.sub("four five six\nseven eight nine", "") 
print modified 

我試過類似的東西,但沒有運氣。

ruby -pe 'gsub(/four five six\nseven eight nine/,"")' < ./test 

有什麼想法嗎?謝謝!

+0

也許正則表達式「或」會幫助:/(四五六七八九)/'。在命令行中這樣的情況下,通常情況下文件將被逐行讀取。 – abiessu

+0

爲什麼選擇「單線」?這是一個人爲的限制,可能不是最好的方法。你想要「空白空間」還是要截斷匹配的文本?你正在截斷,但說你想要「空白」這是一個模糊的術語。而且,爲什麼不使用'sed',這會跑得快很多? –

回答

3

-p標誌會導致Ruby在get(); ... end'循環圍繞腳本執行「時承擔」假設「(從ruby -h),從而分別在每一行上運行命令,然後打印輸出。相反,做一個明確的gets(nil),以使其採取在整個一次投入,然後調用該puts(並在表達式的末尾添加其他\n所以它不會留下一個空行):

ruby -e 'puts gets(nil).gsub(/four five six\nseven eight nine\n/,"")' < ./test 
one two three 
ten eleven twelve 
1

嘗試正則表達式「或」:/(four five six|seven eight nine)/。在命令行中這樣的情況下,通常情況下文件將被逐行讀取。

2

快速完整性檢查;紅寶石匹配換行符沒有問題:

2.0.0-p195 :159 > /abc\ndef/ === "abc\ndef" 
=> true 

有一些注意事項(如果你想.匹配\n使用m修改!)

2.0.0-p195 :161 > /.{7}/ === "abc\ndef" 
=> false 
2.0.0-p195 :162 > /.{7}/m === "abc\ndef" 
=> true 

也許你有在兩端一些空白或東西(/four five six\s*\nseven eight nine/m