Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby一行匹配多行_Ruby_Regex - Fatal编程技术网

Ruby一行匹配多行

Ruby一行匹配多行,ruby,regex,Ruby,Regex,我有一个包含以下内容的文本文件 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 eigh

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

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
ruby-pe'gsub(/四五六\n七八九/,“”)

有什么想法吗?谢谢

试试正则表达式“or”:
/(四五六|七八九)/
。在命令行上出现这种情况时,通常会逐行读取文件。

尝试使用regex“or”:
/(四五六|七八九)/
。在命令行上出现这种情况时,通常会逐行读取文件。

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

2.0.0-p195 :159 > /abc\ndef/ === "abc\ndef"
 => true 
有一些注意事项(如果希望
匹配
\n
!,请使用
m
修饰符)


也许在行尾有一些空格或其他东西,所以在正则表达式中要考虑到这一点(
/four-five-six*\nseven-eight-nine/m

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

2.0.0-p195 :159 > /abc\ndef/ === "abc\ndef"
 => true 
有一些注意事项(如果希望
匹配
\n
!,请使用
m
修饰符)


也许在行的末尾有一些空格或其他东西,所以在正则表达式(
/four-five-six*\nseven-eight-nine/m
)中考虑到这一点,
-p
标志使Ruby在脚本周围“假定”while-get();…end“循环”(from
Ruby-h
),从而在每行上分别运行命令,然后打印输出。相反,执行一个显式操作,使其立即接收整个输入,然后调用
放在上面(并在正则表达式末尾添加另一个
\n
,这样它就不会留下一个空行):

ruby-e'put-get(nil).gsub(/四五六\n七八九/,“”)
标记
-p
会使Ruby在脚本周围“假定”while get();…结束”循环(来自
Ruby-h
),从而在每一行上分别运行命令,然后打印输出。相反,执行一个显式操作,使其立即接收整个输入,然后调用
放在上面(并在正则表达式末尾添加另一个
\n
,这样它就不会留下一个空行):

ruby-e'put-get(nil).gsub(/四五六\n七八九/,“”)
也许一个正则表达式“或”会有所帮助:
/(四五六|七八九)/
。在命令行这样的情况下,通常会逐行读取文件。为什么是“一行”?这是人为的限制,可能不是最好的方式。您想要“空白”还是要截断匹配的文本?你正在截断,但说你想要“空白”,这是一个模糊的术语。还有,为什么不直接使用
sed
,它会运行得快得多?也许一个regex“或”会有帮助:
/(四五六|七八九)/
。在命令行这样的情况下,通常会逐行读取文件。为什么是“一行”?这是人为的限制,可能不是最好的方式。您想要“空白”还是要截断匹配的文本?你正在截断,但说你想要“空白”,这是一个模糊的术语。而且,为什么不直接使用运行速度快得多的
sed
ruby -e 'puts gets(nil).gsub(/four five six\nseven eight nine\n/,"")' < ./test
one two three
ten eleven twelve