Ruby一个衬垫,以匹配多条线

时间:2013-10-25 19:12:00

标签: ruby regex

我有一个包含以下内容的文本文件。

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

我正在尝试将以下Ruby代码转换为Ruby one liner命令,用空格替换两行(四个五六和七八九)。

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

有什么想法吗?谢谢!

3 个答案:

答案 0 :(得分:3)

-p标志导致Ruby“假设”而get(); ...结束'循环遍历您的脚本“(来自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 :(得分:2)

快速健全检查; Ruby匹配换行没有问题:

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

有一些警告(如果您希望m.匹配,请使用\n修饰符!)

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

答案 2 :(得分:1)

试用正则表达式“或”:/(four five six|seven eight nine)/。在命令行中的这种情况下,通常会逐行读取文件。