我有一个包含以下内容的文本文件。
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
有什么想法吗?谢谢!
答案 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)/
。在命令行中的这种情况下,通常会逐行读取文件。