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

任何想法?谢谢!

4

3 回答 3

3

-p标志使 Ruby “假设 'while gets(); ... 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
于 2013-10-25T19:52:11.483 回答
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也许你的行尾有一些空格或其他东西,所以在你的正则表达式( )中考虑到这一点

于 2013-10-25T19:21:21.117 回答
1

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

于 2013-10-25T19:18:37.803 回答