我正在嘗試匹配其他兩個字串之間的字串。該檔案看起來像這樣(實際配置中有更多行):
#config-version=user=user1
#conf_file_ver=1311784161
#buildno=123
#global_vdom=adsf
config system global
set admin-something
set admintimeout 8289392839823
set alias "F5"
set gui-theme mariner
set hostname "something"
end
config system accprofile
edit "prof_admin"
set secfabgrp read
set ftviewgrp read
set vpngrp read
set utmgrp read
set wifi read
next
end
config system np6xlite
edit "np6xlite_0"
next
end
config system interface
edit "dmz"
set vdom "asdf"
set ip 1.1.1.1 255.255.255.0
set type physical
set role dmz
next
edit "wan1"
set vdom "root"
set ip 2.2.2.2 255.255.255.255
set type physical
set alias "jklk5"
set role wan
next
end
config system physical-switch
edit "sw0"
set age-val 0
next
end
config system virtual-switch
edit "lan"
set physical-switch "sw0"
config port
edit "port2"
next
edit "port3"
next
edit "port4"
next
edit "port5"
next
edit "port6"
next
end
next
end
config system custom-language
edit "en"
set filename "en"
next
edit "fr"
set filename "fr"
next
end
config system admin
edit "user1"
set vdom "root"
set password ENC SH2Tb1/aYYJB2U9ER2f5Ykj1MtE6U=
next
edit "user2"
set trusthost1 255.255.255.255 255.255.255.224
set trusthost2 255.255.255.254 255.255.255.224
next
end
config system ha
set override
end
config system replacemsg-image
edit "logo_fnet"
set image-type gif
set image-base64 ''
next
edit "logo_fguard_wf"
set image-type gif
set image-base64 ''
next
edit "logo_fw_auth"
set image-base64 ''
next
edit "logo_v2_fnet"
set image-base64 ''
next
edit "logo_v2_fguard_wf"
set image-base64 ''
next
edit "logo_v2_fguard_app"
set image-base64 ''
next
end
我關心“配置系統管理員”與其相應的“結束”之間的每個“編輯”塊。每個“編??輯”塊代表一個用戶,我需要知道一個用戶塊(編輯“”......新行上的東西......下一個)是否缺少“設定密碼”行。
此運算式(多行)捕獲“config system custom-language”下的“edit "en"...”:
\h*edit ".*\n(?:\h* (?!next|set password).*\n)*\h*next\n
現在我需要確保忽略“配置系統管理員”之前或之后的任何配置部分。我試過這個:
(?<=config system admin\n)\h*edit ".*\n(?:\h* (?!next|set password).*\n)*\h*next\n(?=end)
該更改導致零匹配。但是,如果我將后視更改為:
(?<=config system custom-language\n)
Then I get a match, but it is in the wrong config block again. I tried sticking [\S\s] in front, but that results in zero matches:
[\S\s](?<=config system admin\n)\h*edit ".*\n(?:\h* (?!next|set password).*\n)*\h*next\n(?=end)
How do I take the "set password" matching and make sure it only happens in between "config system admin" and its corresponding "end". I only need the first result, but getting multiple is fine. I am using PCRE2.
uj5u.com熱心網友回復:
以下模式將以編輯開始,在結束或編輯之前停止,并且不允許密碼、配置系統或設定檔案名。
它有點長且笨拙,但如果密碼一詞不存在并且與 2 個開始塊不匹配,它確實可以找到普通用戶。
如前所述,如果在檔案的其他位置找到關鍵字,它可能會出現故障。
/edit((?!edit)(?!(edit|password|config sys|set filename))[\w\W])*(?=(edit|end))/gm
如果您有可能使用一個簡單的腳本,例如 bash,它可以逐行讀取,我們可以構建一些更可靠的簡單腳本。
uj5u.com熱心網友回復:
您可以使用:
(?<=config system admin.*?edit "[^"] ")(?!.*?set password.*?next).*?(?=next.*?end)
它需要global和singleline標志。如果不能使用singleline,請將點 ( .)替換為[\s\S].
說明:
(?<=config system admin.*?edit "[^"] ")- 在后面查找“配置系統管理員”,后跟任何字符(非貪婪),然后是“編輯”和用戶名
(?!.*?set password.*?next)- 向前看 NOT 'set password',后跟任何字符和 'next'
.*?- 任何字符
(?=next.*?end)- 期待“下一個”,最后是“結束”。
uj5u.com熱心網友回復:
我認為你想從兩個層面來完成這項任務。首先,找到那些配置塊中的資料,然后檢查其中的用戶。
這是更簡單的東西,可以滿足您的需要。
首先,您只想查看“config system admin”和“end”之間的行,所以使用 awk 來查找它們。
$ awk '/^config system admin/,/^end/' config.txt
config system admin
edit "user1"
set vdom "root"
set password ENC SH2Tb1/aYYJB2U9ER2f5Ykj1MtE6U=
next
edit "user2"
set trusthost1 255.255.255.255 255.255.255.224
set trusthost2 255.255.255.254 255.255.255.224
next
end
現在在這些結果中搜索“編輯”或“設定密碼”:
$ awk '/^config system admin/,/^end/' config.txt | grep -E 'edit|set password'
edit "user1"
set password ENC SH2Tb1/aYYJB2U9ER2f5Ykj1MtE6U=
edit "user2"
您現在可以查看結果并查看誰設定了密碼,誰沒有設定密碼。
如果您需要更精確,那么您可以撰寫更多代碼來查找“設定密碼”后面沒有的“編輯”行。
無論如何,關鍵是將問題分解為更小的問題。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/445145.html
標籤:regex
下一篇:字串中最后一點或逗號的正則運算式
