我用的是Ruby1.8.7我有一个包含以下内容的文本文件:
"testhost-01.test.de|lan|ip-v4|cmk-agent|tcp|ip-v4-only|site:tir_projects|test|wato|/" + FOLDER_PATH + "/",
"testhost-02.test.de|lan|ip-v4|cmk-agent|tcp|ip-v4-only|site:tir_projects|prod|puppetagent|wato|/" + FOLDER_PATH + "/",
"testhost-03.test.de|wan|ip-v4|cmk-agent|tcp|ip-v4-only|site:tir_projects|prod|puppetagent|wato|/" + FOLDER_PATH + "/",
"testhost-04.test.de|ip-v4|cmk-agent|tcp|ip-v4-only|site:tir_projects|dmz|prod|puppetagent|wato|/" + FOLDER_PATH + "/",
"testhost-05.test.de|wan|ip-v4|cmk-agent|tcp|ip-v4-only|site:tir_projects|prod|puppetagent|wato|/" + FOLDER_PATH + "/",
"testhost-06.test.de|lan|ip-v4|cmk-agent|tcp|ip-v4-only|site:tir_projects|prod|wato|/" + FOLDER_PATH + "/",
"testhost-07.test.de|ip-v6|cmk-agent|tcp|site:tir_projects|ip-v6-only|dmz|prod|puppetagent|wato|/" + FOLDER_PATH + "/",
"testhost-08.test.de|ip-v4|snmp|snmp-only|ip-v4-only|critical|site:tir_projects|dmz|wato|/" + FOLDER_PATH + "/",
我试图将主机名(
testhost-01.test.de
-testhost-08.test.de
)提取到数组中,但仅当"puppetagent"
位于同一行时。结果应该是:
[
"testhost-02.test.de",
"testhost-03.test.de",
"testhost-04.test.de",
"testhost-05.test.de",
"testhost-07.test.de"
]
代码示例:
path = "Textfile"
file = IO.read(path)
nodes = file.scan(/^"(.*)\|lan.*\|puppetagent/).flatten
上面的示例仅适用于第一个管道之后,
“lan”紧随其后,因此它只找到主机
02
。 最佳答案
如果不希望将输出限制为包含|lan
的行,则不能在表达式中包含|lan
。看起来您希望|lan
标记捕获组的结束-相反,您可以使用字符集|
限制捕获组不包括[^|]
然后,即使该行不包含lan
,您也将在第一个|
处停止在|
之后,您在puppetagent
之前不关心内容,因此我们将使用.*
来消费内容。
/^"([^|]*).*puppetagent/
用通俗易懂的英语说
^"
从"
开始([^|]*)
捕获任何非a|
.*
接受在线上的任何内容puppetagent
要求puppetagent
在场