我的文本文件包含以下文本,需要根据条件进行过滤。
CODE=0xea00e60c
CODE=0xea00e60d
OUTPUT="HW Address: 91183010\n,HWType:00000030\n"
CODE=0xea00e60e
CODE=0xea01ff00
如果该行以CODE开头,则从第一行提取0x(例如ea00e60c)之后的所有内容,然后粘贴到 xyz 文件中。 如果该行以OUTPUT开头,请提取所有双引号并将其粘贴到 xyz 文件中。应保持提取文本并将其放入 XYZ 文件的顺序。
def filter_logs(filename)
postcode = "postcode_logs"
File.open(filename, 'r').each do |line|
result = (line.scan(/"(.*?)"/)) || (line.split("x")[1])
File.open(postcode, 'a') do |selected_line|
selected_line.puts(result)
end
end
end
文件名和邮政编码已被文件定义。
代码中没有错误,但输出也不存在。
**Expected output**
ea00e60c
ea00e60d
HW Address: 91183010\n,HWType:00000030\n
ea00e60e
ea01ff00
**current output**
HW Address: 91183010\n,HWType:00000030\n
答案 0 :(得分:1)
此操作未成功的原因是,#scan
总是成功。如果未找到任何内容,则返回一个空数组(其值为真)。只需获得第一个结果就足够了(对于空数组返回nil
):
result = line.scan(/"(.*?)"/).first || line.split("x")[1]
尽管您也可以使用其他技术,例如:
result = line[/\ACODE=0x(\h*)/, 1]
result ||= line[/\AOUTPUT="([^"]*)"/, 1]
从字符串的开头匹配CODE=0x
,后跟零个或多个十六进制字符(\h*
),将它们捕获在组1中;或者OUTPUT="
,然后跟零或多个非引号字符([^"]*
)在第1组中捕获它们,然后是"
。
如果尚不清楚正则表达式,请检查regular expression documentation for Ruby。如果不清楚方括号方法的使用情况,请查看documentation of the square bracket accessor of String。