如何读取txt文件中的两个特殊字符与Powershell之间的线

嗨,我几乎是Powershell的新手。 我需要阅读一些文本文件中的特定行,并将它们放到不同的数组中。 我有一个文件看起来像这样:如何读取txt文件中的两个特殊字符与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][IP]之间的所有行?

回答:

密切相关:Grabbing specific sections of a txt file via Powershell

如果它是可以接受的第一个将整个文件读入内存:

$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 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然后操作在那一个多行字符串,使用正则表达式(正则表达式)来匹配整个输入字符串,具有匹配的兴趣仅线捕获组(...)),并且更换整个只有捕获组的字符串,有效地返回该部分的行。
  • 最后,-split '\r?\n'将提取的多行字符串拆分为行数组。

    • 内联的正则表达式的选项(?sm)匝上都米 ULTI线和小号英格尔行选项:

      正则表达式的说明m表示^$ matc h每个行的起始和结尾而不是整个输入字符串。

    • s意味着元字符.\n字符匹配也是如此,从而使诸如.*一个表达式可以用于匹配跨行
  • \A的(多线)输入的一开始相匹配,和\Z最后。

  • \r?\n匹配单个换行符,CRLF和LF变量。

  • (.*?)是捕获组(非贪婪)捕获部分内的所有内容。

  • (?:\r?\n\[.*|(?:\r?\n)?\Z)使用非捕获组((?:...))感兴趣的部分,它可以是所述部(换行之后是[)的开始或结束后,以匹配一切的输入文件(无论是否有尾随换行符)。

  • 注意,正则表达式的整个输入字符串匹配,然后与感兴趣刚子(范围),在第一次(也是唯一一个)捕获组($1)抓获替换它。

回答:

法经典:

$found=$false 

$Listword=(gc C:\temp\list.txt).Split("[]".ToCharArray())

$Servers=foreach ($item in $Listword)

{

if ($item -eq "IP") { break }

if ($item -eq "Servers") {$found=$true; continue}

if ($found) {$item}

}

$Servers

以上是 如何读取txt文件中的两个特殊字符与Powershell之间的线 的全部内容, 来源链接: utcz.com/qa/257702.html

回到顶部