【发布时间】:2021-04-10 15:43:29
【问题描述】:
我正在尝试创建一个正则表达式来匹配 SSH 配置文件中的条目,该文件具有以下基本结构:
Host <Name>
Field1 Value1
FieldN ValueN
Host *
Field1 Value1
FieldN ValueN
Host !<name>
Field1 Value1
FieldN ValueN
关于此结构的注意事项: 缩进是可选的(我首先在我的模式中使用 \s 直到我意识到这一点)。更多细节在这里:https://linuxize.com/post/using-the-ssh-config-file/
在给定的 SSH 配置文件中可以有任意数量的主机(以及每个主机的参数/字段)。我正在努力想出正确的语法来捕获所有情况,并对事物进行适当的分组,以便我可以在我的解析代码中轻松处理它们。
看来,由于缩进是可选的,模式的“伪代码”基本上是:
匹配主机后跟空格,然后是任何有效主机名字符的行,加上!和/或 *,以换行符结尾:
(Host\s[a-zA-Z0-9-!\*]+)\n)
然后匹配任何后续行,其中空格之前的任何内容都是字段名称,第一次出现空格之后的任何内容都是该字段的值,直到下一个“Host ...”行的实例,其中点它应该是它自己的单独匹配。我已经研究过使用几个不同的标志或运算符来完成最后一部分,但我无法确切地弄清楚如何使它工作,或者这样的事情是否可能。
另一种想法是完全废弃正则表达式并为文件编写自定义解析器,逐行迭代并跟踪每个主机的选项,但正则表达式将是理想的,因为传递给我的函数的文件可能会也可能不会即使是SSH配置文件,代码也是为了确认是否是,如果是,解析相关数据。
任何关于正则表达式的指导将不胜感激!
【问题讨论】:
-
可以获取每次出现的索引,然后根据这些索引将字符串分割成若干个子字符串
-
谷歌快速搜索后,似乎有多个开源的 go 包用于读取和操作 ssh 配置文件