2017-12-02 62 views
2

嗨,我几乎是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]之间的所有行?

回答

0

密切相关: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)抓获替换它。

0

法经典:

$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 
相关问题