嗨,我几乎是 Powershell 的新手。
我需要读取文本文件中的一些特定行并将它们放入不同的数组中。
我有一个如下所示的文件:
[Servers]
Server1
Server2
Server3
Server4
[IP]
10.10.10.10
10.10.10.20
10.10.30.30
192.168.1.2
192.168.1.4
[Path]
C:\Log\*.log
D:\Files\*.txt
D:\Files\*.csv
D:\Files\*.xml
[Gateway]
10.10.10.1
10.10.30.2
192.168.1.1
我的问题是我需要阅读以下几行[Servers]
(有时 3 行,有时更多)并将它们放入一个数组中。
如何选择之间的所有行[Servers]
and [IP]
当我不知道有多少行时?
Closely related: Grabbing specific sections of a txt file via Powershell https://stackoverflow.com/q/44958963/45375
如果可以先将整个文件读入内存:
$regex = '(?ms)\A.*?^\[Servers\]\s*\r?\n(.*?)(?:\r?\n\[.*|(?:\r?\n)?\Z)'
$servers = (Get-Content -Raw file.txt) -replace $regex, '$1' -split '\r?\n'
重构为一个简单的function接受输入文件和感兴趣部分的名称:
function get-SectionLines([string] $LiteralPath, [string] $SectionName) {
$regex = '(?ms)\A.*?^\[{0}\]\s*\r?\n(.*?)(?:\r?\n\[.*|(?:\r?\n)?\Z)' -f [regex]::Escape($SectionName)
(Get-Content -Raw -LiteralPath $LiteralPath) -replace $regex, '$1' -split '\r?\n'
}
$servers = get-SectionLines file.txt Servers
解释:
-
Get-Content -Raw
将整个文件读入内存单串.
-
-replace
然后使用 regex(正则表达式)对该多行字符串进行操作来匹配entire输入字符串,带有捕获组 ((...)
)仅匹配感兴趣的行,并仅用捕获组替换整个字符串,从而有效地仅返回该部分的行。
- 最后,
-split '\r?\n'
将提取的多行字符串拆分为行数组。
正则表达式的解释:
-
内联正则表达式选项(?sm)
打开两个m多线和s单行选项:
-
m
意思是^
and $
匹配每个的开始和结束line而不是整个输入字符串。
-
s
意味着元字符.
火柴\n
字符也是如此,这样的表达式.*
可以用来匹配跨线.
\A
匹配(多行)输入的开头,并且\Z
最后。
\r?\n
匹配单个换行符,包括 CRLF 和 LF 类型。
(.*?)
是(非贪婪地)捕获该部分内所有内容的捕获组。
(?:\r?\n\[.*|(?:\r?\n)?\Z)
使用非捕获组((?:...)
) 匹配所有内容after感兴趣的部分,可以是next部分(换行符后跟[
) or 输入文件的末尾(带或不带尾随换行符)。
请注意,正则表达式匹配entire输入字符串,然后将其替换为在第一个(也是唯一的)捕获组中捕获的感兴趣的子字符串(范围)($1
).
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)