我有一长串存储在变量中的信息,我需要针对该变量运行一些正则表达式,并从找到的内容中获取各种信息。
这是我正在谈论的一个例子。
body =“service timestamps log datetime msec localtime show-timezone 服务密码加密 ! 主机名switch01 ! 引导启动-标记“
如果我搜索包含“hostname”的行,我需要行号,在这种情况下它将是4.我还需要将“hostname switch01”行存储为另一个变量。
有什么想法吗?
谢谢!
答案 0 :(得分:0)
首先,您需要将字符串转换为行:body.split('\n')
,然后您想要在行中添加行号:.each_with_index
。然后,您要选择行.select {|line, line_nr| line =~ your_regex }
。把它们放在一起:
body.split('\n').each_with_index
.select {|line, line_nr| line =~ your_regex }
.map {|line, line_nr| line_nr }
这将为您提供与'your_regex'
匹配的所有行答案 1 :(得分:0)
假设您有一个提供file
方法的对象#lines
:
lines = file.lines.each_with_index.select {|line, i| line =~ /regex/ }
如果您已经有一个行列表,则可以忽略对#lines
的呼叫。如果您有字符串,则可以使用string.split("\n")
这将导致变量lines
包含一个2元素数组的数组,其中的行与您的RegEx和原始文件中的行的索引相匹配。
file.lines
得到了界限 - 当然我提到的其他方法也适用于你。然后我们使用#each_with_index
为每个元素添加索引,因为您也想存储它们。这与#map.with_index {|e, i| [e, i]}
具有相同的效果,即将每个元素映射到[element, index]
。然后,我们使用#select
方法获取与您的RegEx匹配的所有行(FYI,=~
是Ruby,Perl和其他语言中的匹配运算符 - 如果您还不知道的话)。我们之后就完成了,但您可能需要进一步转换数据,以便处理它。